版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haruno_Sakura/article/details/78446217
实验题2:实现链栈的各种基本运算的算法
内容: 编写一个程序listack.cpp,实现链栈的各种基本运算,并在此基础上设计一个程序exp3-2.cpp,完成如下功能:
(1)初始化栈s。
(2)判断栈s是否非空
(3)依次进栈元素a,b,c,d,e;
(4)判断栈S是否非空。
(5)输出出栈序列
(6)判断栈S是否非空。
(7) 释放栈。
代码:
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef int ElemType; //自定义类型;
typedef struct linknode
{
ElemType data; //数据域
struct linknode *next; //指针域
}LinkStNode; //链栈节点类型;
//初始化栈其实是创建链栈的头节点,并将next域置为NULL;
void InitStack(LinkStNode*&s) //初始化栈;
{
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next=NULL;
}
//该运算释放链栈S占用的全部节点空间,和单链表的销毁算法完全相同;
void DestroyStack(LinkStNode *&s) //销毁栈
{
LinkStNode *pre=s,*p=s->next; //pre指向头结点,p指向首节点
while(p!=NULL) //扫描链栈s,当P不为空时循环;
{
free(pre); //释放pre节点;
pre=p; //pre 和 p 同时后移一个节点;
p=pre->next;
}
free(pre); //循环结束时p为NULL,pre 指向尾节点,释放他;
}
//栈的四要素:栈为空的条件:s->next==NULL是否成立;
bool StackEmpty(LinkStNode *s) //判断栈是否为空
{
return (s->next==NULL);
}
//该运算新建一个节点,用于存放元素e(由p指向他,然后将其插入头结点后作为新的首节点;
bool Push(LinkStNode *&s,ElemType e) //进栈
{
LinkStNode *p; //新建节点p
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e; //存放元素e;
p->next=s->next; //将p节点插入作为首节点;
s->next=p;
}
//在栈不为空的条件下,提取首节点的数据域赋予给引用型参数e,然后将其删除;
bool Pop(LinkStNode *&s,ElemType &e) //出栈
{
LinkStNode *p;
if(s->next==NULL) //栈空情况;
return false;
p=s->next; //p指向首节点
e=p->data; //提取首节点值;
s->next=p->next; //删除首节点
free(p); //释放被删节点的存储空间;
return true; //返回真;
}
int main()
{
LinkStNode *s;
ElemType e;
printf("栈链的各种基本运算算法如下: \n\n");
printf(" (1).初始化栈S:\n");
InitStack(s);
printf(" (2).判断栈s是否非空: %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是否非空: %s\n",StackEmpty( s)?"空":"非空");
printf(" (5).输出出栈序列:" );
while(!StackEmpty(s))
{
Pop(s,e);
printf("%c ",e);
}
printf("\n");
printf(" (6).判断栈s是否非空: %s\n",StackEmpty(s)?"空":"非空");
printf(" (7).释放栈\n");
DestroyStack(s);
return 0;
}