栈和队列的典型算法实现
一、实验目的
1.掌握栈的表示与实现
2.掌握栈的入栈、出栈等操作
二、实验内容
编写及实现顺序栈的定义及基本操作函数编写一个程序实现顺序栈(假设栈的基本元素类型为char)的各种基本运算,并在此基础上设计一个程序完成下述功能。
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈s。
三、实验设备与环境
Windows 11
codeblocks
四、实验设计方案
1.初始化栈:首先,初始化一个空栈,检查InitStack函数是否正确地将栈初始化为空。
void InitStack(LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}
2.判断栈是否为空:使用StackEmpty函数检查初始化后的栈是否为空。
bool StackEmpty(LiStack *s)
{
return(s->next==NULL);
}
3.入栈操作:你可以使用Push函数将一些元素(例如'a', 'b', 'c', 'd', 'e')推入栈中,并使用StackLength函数检查栈的长度。
void Push(LiStack *&s,ElemType e)
{ LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e; //新建元素e对应的节点*p
p->next=s->next; //插入*p节点作为开始节点
s->next=p;
}
4.出栈操作:你可以使用Pop函数从栈顶弹出一个元素,并使用GetTop函数获取并显示当前栈顶的元素。
bool Pop(LiStack *&s,ElemType &e)
{ LiStack *p;
if (s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向开始节点
e=p->data;
s->next=p->next; //删除*p节点
free(p); //释放*p节点
return true;
}
5.释放栈:最后,你可以使用DestroyQueue函数释放动态分配的内存,并检查是否成功释放
void DestroyQueue(LiStack *&s)
{
LiStack *p=s->next;
while (p!=NULL)
{
free(s);
s=p;
p=p->next;
}
free(s); //s指向尾结点,释放其空间
}
五、代码实现
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
char w;
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 DestroyQueue(LiStack *&s)
{
LiStack *p=s->next;
while (p!=NULL)
{
free(s);
s=p;
p=p->next;
}
free(s); //s指向尾结点,释放其空间
}
int StackLength(LiStack *s)
{
int i=0;
LiStack *p;
p=s->next;
while (p!=NULL)
{
i++;
p=p->next;
}
return(i);
}
bool StackEmpty(LiStack *s)
{
return(s->next==NULL);
}
void Push(LiStack *&s,ElemType e)
{ LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e; //新建元素e对应的节点*p
p->next=s->next; //插入*p节点作为开始节点
s->next=p;
}
bool Pop(LiStack *&s,ElemType &e)
{ LiStack *p;
if (s->next==NULL) //栈空的情况
return false;
p=s->next; //p指向开始节点
e=p->data;
s->next=p->next; //删除*p节点
free(p); //释放*p节点
return true;
}
bool GetTop(LiStack *s,ElemType &e)
{ if (s->next==NULL) //栈空的情况
return false;
e=s->next->data;
return true;
}
int main()
{
LiStack *s;
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,w);
printf("%c",w);
}
printf("\n");
printf("(6)判断栈s是否非空: %s\n",(StackEmpty(s)?"空":"非空"));
printf("(7)释放栈 \n");
DestroyQueue(s);
return 0;
}
六、运行结果