编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化链栈
(2)链栈置空
(3)入栈
(4)出栈
(5)取栈顶元素
(6)遍历链栈
链栈的功能实现:
#include <stdio.h>#include <malloc.h>#define ERROR 0#define OK 1#define TRUE 1#define FALSE 0typedef int ElemType;typedef int Status;typedef struct node{ElemType data;struct node *next;}StackNode;typedef struct{StackNode *top;}LinkStack;//初始化 void InitStack(LinkStack *s){s->top = NULL;puts("链栈初始化完成!");}//将链栈置空Status SetEmpty(LinkStack *s){StackNode *p = s->top;while(p){s->top = p->next;free(p);p = s->top;}puts("链栈已置空!");return OK;}//压栈Status Push(LinkStack *s, ElemType e){StackNode *p;p = (StackNode *)malloc(sizeof(StackNode));p->data = e;p->next = s->top;//把要压入的元素内存单元的next指针指向栈顶s->top = p;//栈顶指向新压入的元素内存单元return OK;}//弹栈Status Pop(LinkStack *s, ElemType *e){StackNode *p = s->top;if(s->top == NULL){puts("栈空, 不能进行弹栈操作!");return ERROR;}s->top = p->next;//让栈顶指针指向前一个元素,*e = p->data;free(p);//释放栈顶元素内存空间return OK;}Status GetTop(LinkStack *s, ElemType *e){if(s->top == NULL){puts("栈空, 无栈顶元素!");return ERROR;}*e = s->top->data;return OK;}//打印栈 Status PrintStack(LinkStack *s){StackNode *p;p = s->top;while(p){printf("%d ", p->data);p = p->next;}puts("");return OK;}
测试代码段
int main(){LinkStack s;InitStack(&s);int n, e;printf("请输入链栈长度:\n");scanf("%d", &n);puts("请输入要录入的数据:");while(n--){int x;scanf("%d", &x);Push(&s, x);}PrintStack(&s);GetTop(&s, &e);printf("栈顶元素为:%d\n",e);puts("8入栈后:");Push(&s,8);PrintStack(&s);Pop(&s, &e);printf("弹栈元素是:%d\n", e);puts("弹栈后:");PrintStack(&s);SetEmpty(&s);return 0;}
运行结果: