栈之链式存储基本操作

来源:互联网 发布:聚划算抢购软件 编辑:程序博客网 时间:2024/06/05 04:19
#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;}

运行结果:


心得:

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

0 0
原创粉丝点击