首页 > 学院 > 开发设计 > 正文

栈之链式存储基本操作

2019-11-14 09:27:59
字体:
来源:转载
供稿:网友
#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;}

运行结果:

心得:

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表