#include <stdio.h>#include <stdlib.h>//栈的链式存储结构typedef char ElemType;typedef struct linknode{ ElemType data;//数据域 struct linknode *next;//指针域}LiStack;//初始化栈void InitStack(LiStack *&s){ s=(LiStack *)malloc(sizeof(LiStack)); s->next=NULL;}//销毁栈void DestroyStack(LiStack *&s){ LiStack *p=s,*q=s->next; while(q!=NULL) { free(p); p=q; q=p->next; } free(p);}//判断栈是够为空bool StackEmpty(LiStack *s){ return (s->next==NULL);}//进栈void Push(LiStack *&s,ElemType e){ LiStack *p=s; p=(LiStack *)malloc(sizeof(LiStack));//新建元素p p->data=e; /************************/ p->next=s->next; s->next=p; /************************/}//出栈bool Pop(LiStack *&s,ElemType &e){ LiStack *p; if(s->next==NULL) return false; p=s->next; e=p->data; /************************/ s->next=p->next; free(p); /************************/}//取栈顶元素bool GetTop(LiStack *s,ElemType &e){ LiStack *p; if(s->next==NULL) return false; p=s->next; e=p->data; return true;}int main(){ ElemType e; LiStack *s; PRintf("栈s的基本运算如下:/n"); printf(" (1)初始化栈s/n"); InitStack(s); printf(" (2)栈为%s/n",(StackEmpty(s)?"空":"非空")); printf(" (3)依次进栈元素a,b,c,d,e/n"); Push(s,'a'); Push(s,'b'); Push(s,'c'); Push(s,'d'); Push(s,'e'); printf(" (4)栈为%s/n",(StackEmpty(s)?"空":"非空")); printf(" (5)出栈序列:"); while (!StackEmpty(s)) { Pop(s,e); printf("%c ",e); } printf("/n"); printf(" (6)栈为%s/n",(StackEmpty(s)?"空":"非空")); printf(" (7)释放栈/n"); DestroyStack(s); return 0;}运行结果:
心得:
栈的链式存储结构是没有到栈顶的情况的,可以无限长。其实无论进栈出栈还是删除栈元素,用到的操作都是单链表的基本操作,进栈就是头插法,出栈就是删除第一个元素。另外出栈和去栈顶元素时要注意判断栈空的情况。
新闻热点
疑难解答