# include
# include
typedef struct student //声明节点
{
char date;
struct student * next;
}NODE,* PNODE;
typedef struct stack//声明栈入口
{
PNODE top;
PNODE bottom;
}STACK,* PSTACK;
void initstack(PSTACK ps);//初始化参数 参数1.栈入口的地址
void push(PSTACK,char);//压入一个数据 参数1.栈入口的地址 参数2.需要压入的数据
bool pop(PSTACK,char *);//将一个数据出栈 参数1.栈入口的地址 参数2.需要保存出栈的数据地址 ,出栈失败返回 FALSE 真返回 TURE
void trversal(PSTACK ps);//遍历一个栈的数据 参数1.栈的地址
int main(void)
{
STACK ps;
int avl;
char ch;
initstack(&ps);
printf("请输入需要进栈字符,字符与栈顶元素相同,则弹出栈顶元素,否者压入栈。\n如果接收的字符为‘$’则停止输入\n");
do
{
scanf("%c",&ch);
getchar();
if(ch == '$')
break;
else if(ch == ps.top->date)
pop(&ps,&ch);
else
push(&ps,ch);
}while (1);
printf("栈的数据为");
trversal(&ps);
return 0;
}
void initstack(PSTACK ps)
{
ps->top = (PNODE)malloc(sizeof(NODE));//创建新节点
if(ps->top == NULL)
{
printf("初始化栈失败!\n");
exit(-1);
}
else
{
printf("完成初始化!\n");
ps->bottom = ps->top; //设置栈底
ps->bottom->next = ps->top->next = NULL; //将栈底节点指向设置为NULL
}
return;
}
void push(PSTACK ps,char avl)
{
PNODE pnew = (PNODE)malloc(sizeof(NODE));
if(pnew == NULL)
{
printf("分配内存失败!");
exit(-1);
}
pnew->date = avl; //设置想节点数据
pnew->next = ps->top;//将顶部节点地址设置为新节点指向地址
ps->top = pnew;//将新节点设置为顶部地址
return;
}
bool pop(PSTACK ps,char * avl)
{
PNODE dell;
if(ps->top->next == NULL) //如果为空栈底返回
{
return false;
}
else
{
dell = ps->top; //保存原始顶层栈地址
* avl = ps->top->date; //保存顶层数据
ps->top = ps->top->next;//设置下一层地址为顶层地址
free(dell);
dell = NULL;
}
return true;
}
void trversal(PSTACK ps)
{
PNODE ph;
ph = ps->top;
while(ph->next != NULL)//如果不为 头节点
{
printf("%c ",ph->date);//输出数据
ph = ph->next;//设置为下一节点
}
printf("\n");
return;
}