栈之链式存储基本操作

    xiaoxiao2021-03-26  25

    #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; }

    运行结果:

    心得:

    栈的链式存储结构是没有到栈顶的情况的,可以无限长。其实无论进栈出栈还是删除栈元素,用到的操作都是单链表的基本操作,进栈就是头插法,出栈就是删除第一个元素。另外出栈和去栈顶元素时要注意判断栈空的情况。

    转载请注明原文地址: https://ju.6miu.com/read-661432.html

    最新回复(0)