参考网上的内容,大部分的链栈实现用到了栈底和栈顶两个指针,而下文整理的这份代码,基本上与单链表的实现方式如出一辙。
与王道复习指导上给的栈的链式存储类型相一致。
#include<stdio.h> #include<malloc.h> typedef struct Linknode{ int data; struct Linknode *next; }Linknode,*LiStack; /* -1- 初始化链栈*/ bool InitStack(LiStack S){ S->next = NULL; return true; } /* -2- 判断是否栈空*/ bool StackEmpty(LiStack S){ if(S->next == NULL){ printf("空栈!\n"); return true; } else{ return false; } } /* -3- 进栈(插入元素)*/ bool Push(LiStack S,int e){ Linknode *temp; temp = (Linknode*)malloc(sizeof(Linknode)); temp->data = e;//!1 temp->next = S->next;//!2 S->next = temp;//!3 //!!!S->next是首元节点 return true; } /* -4- 读取栈顶元素*/ int GetTop(LiStack S,int e){ if(!StackEmpty(S)){ e = S->next->data;//!4 } else{ return false; } return e; } /* -5- 出栈*/ bool Pop(LiStack S,int e) { Linknode *temp = S->next; e = temp->data; S->next = temp->next; free(temp); return true; } int main(){ LiStack S; S = (LiStack)malloc(sizeof(Linknode)); InitStack(S); int l; printf("请输入元素个数:\n"); scanf("%d",&l); printf("请依次输入:\n"); for(int i=0; i<l; i++){ int m; scanf("%d",&m); Push(S,m); } int flag; printf("请进行选择:\n"); printf("==1.栈顶元素:\n"); printf("==2.依次输出栈内元素:\n"); scanf("%d",&flag); switch(flag){ case(1): { int e; printf("当前栈顶元素为:%d\n",GetTop(S,e)); break; } case(2): { int i=0; while(l > 0) { int n; printf("经过第%d次出栈操作后,当前栈顶元素为:%d\n",i,GetTop(S,n)); Pop(S,n); l--; i++; } printf("结束!\n"); break; } } return 0; }
最终结果: