实现链栈的各种基本运算的算法
一、实验内容
内容:编写一个程序实现链栈(假设栈中的元素类型 ElemType为cha的各种基本运算,并在此基础上设计一个程序完成以下功能。
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈。
二、实验目的
本实验旨在通过编写一个程序实现链栈的基本操作,包括初始化、判断栈是否非空、进栈、出栈、输出出栈序列以及释放栈,以加深对链栈数据结构的理解和掌握。
三、实验设计方案
- 定义链栈结构体
首先需要定义链栈的结构体,包括一个指向栈顶节点的指针top以及一个用于存储节点数据的数组或链表。 - 初始化栈
初始化栈可以通过将top指针置为NULL来实现。 - 判断栈是否非空
判断栈是否非空可以通过判断top指针是否为NULL来实现。如果top指针不为NULL,则栈非空;否则,栈为空。 - 依次进栈元素a、b、c、d、e
进栈操作可以通过创建新节点并将其插入到链表的头部来实现。具体步骤如下:
a. 创建新节点并设置其数据为需要进栈的元素。
b. 将新节点的next指针指向当前的top节点。
c. 将top指针指向新节点。
重复以上步骤,直到所有元素都进栈。 - 判断栈s是否非空
同上,判断栈是否非空可以通过判断top指针是否为NULL来实现。 - 输出出栈序列
出栈操作可以通过遍历链表并输出每个节点的数据来实现。具体步骤如下:
a. 定义一个指针temp指向当前top节点。
b. 将top节点从链表中删除并释放其内存。
c. temp指针向后移动一个节点,即temp = temp->next。
d. 输出temp指向的节点的数据。
重复以上步骤,直到temp指针为NULL,即所有元素都出栈。 - 判断栈s是否非空
同上,判断栈是否非空可以通过判断top指针是否为NULL来实现。 - 释放栈
最后需要释放整个链表所占用的内存空间,包括每个节点的内存以及top指针所指向的内存空间。
四、代码实现
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct linknode{
char data;
struct linknode *next;
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s){
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next=NULL;
}
//销毁栈
void DestroyStack(LinkStNode *&s){
LinkStNode *pre=s,*p=s->next;
while(p!=NULL){
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
//判断表空
bool StackEmpty(LinkStNode *s){
return(s->next==NULL);
}
//进栈push
void Push(LinkStNode *&s,char e){
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
//出栈Pop
bool Pop(LinkStNode *&s,char &e){
LinkStNode *p;
if(s->next==NULL) return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
//得到栈顶元素
bool GetTop(LinkStNode *&s,char &e){
if(s->next==NULL)return false;
e=s->next->data;
return true;
}
int main(){
LinkStNode *s;
char e;
//1初始化栈
InitStack(s);
printf("1、初始化栈:完成!\n");
//2判断栈是否为空
printf("2、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//3依次进栈元素a、b、c、d、e
printf("3、依次进栈元素a、b、c、d、e:");
char a[5]={'a','b','c','d','e'};
for(int i=0;i<5;i++){
Push(s,a[i]);
printf("%c\t",e);
}
printf("\n");
//4判断栈是否为空
printf("4、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//5输出出栈序列
printf("5、输出出栈序列:");
while(s->next!=NULL){
Pop(s,e);
printf("%c\t",e);
}
printf("\n");
//6判断栈是否为空
printf("5、判断栈是否为空:");
StackEmpty(s);
if(StackEmpty(s))printf("栈s为空!\n");
else printf("栈s非空!\n");
//7释放栈
printf("7、释放栈:完成!");
DestroyStack(s);
return 0;
}