//该程序的功能为模拟链栈(还有顺序栈,是用数组实现的) #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct node { int date; struct node *pnext; }NODE,* PNODE; typedef struct stack { PNODE ptop; PNODE pbottom; }STACK,* PSTACK; //初始化栈 void init(PSTACK); //出栈操作 void push(PSTACK); //判断栈是否为空 int isempty(PSTACK); //遍历栈 void traverse(PSTACK); //出栈操作 void pop(PSTACK); //清空栈 void clear(PSTACK); void menu(PSTACK ps) { int item; printf("\n********************************模拟链栈******************************\n"); while(1) { printf("\t\t1、入栈\n\t\t2、遍历栈\n\t\t3、出栈\n\t\t4、判断栈是否为空(无结果表示栈不空)\n\t\t5、清空栈\n\t\t6、清屏\n\t\t7、退出\n"); printf("\t\t输入你的选择:\n"); scanf("%d",&item); switch(item) { case 1: push(ps); break; case 2: traverse(ps); break; case 3: pop(ps); break; case 4: isempty(ps); break; case 5: clear(ps); break; case 6: system("cls"); break; case 7: exit(0); break; default: printf("输入有误重新输入:\n"); break; } } } int main() { STACK s; init(&s); menu(&s); return 0; } //初始化栈,使得栈顶指针和栈底指针指向同一个节点,该节点的指针域为空 void init(PSTACK ps) { ps->ptop=ps->pbottom=(PNODE)malloc(sizeof(NODE)); ps->ptop->pnext=NULL; } //判断栈是否为空(链栈不存在栈满的问题) int isempty(PSTACK ps) { if(ps->ptop==ps->pbottom) { printf("栈空!\n"); return 1; } return 0; } //入栈操作 void push(PSTACK ps) { int i; PNODE p; p=(PNODE)malloc(sizeof(NODE)); printf("输入入栈的数据(整形):\n"); scanf("%d",&i); p->date=i; p->pnext=ps->ptop; ps->ptop=p; printf("入栈成功!\n"); } //遍历栈 void traverse(PSTACK ps) { PNODE p=ps->ptop; while(p->pnext!=NULL) { printf("\t%d",p->date); p=p->pnext; } printf("\n"); } //出栈操作 void pop(PSTACK ps) { if(!isempty(ps)) { PNODE p=ps->ptop;//释放栈顶节点时用 ps->ptop=ps->ptop->pnext; free(p); printf("栈顶元素出栈成功!\n"); } } //清空栈 void clear(PSTACK ps) { PNODE p; while(!isempty(ps)) { p=ps->ptop; ps->ptop=ps->ptop->pnext; free(p); } }