李春葆 上机实验题3——实验题2:实现链栈的各种基本运算的算法

实现链栈的各种基本运算的算法

一、实验内容

内容:编写一个程序实现链栈(假设栈中的元素类型 ElemType为cha的各种基本运算,并在此基础上设计一个程序完成以下功能。
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈。

二、实验目的

本实验旨在通过编写一个程序实现链栈的基本操作,包括初始化、判断栈是否非空、进栈、出栈、输出出栈序列以及释放栈,以加深对链栈数据结构的理解和掌握。

三、实验设计方案

  1. 定义链栈结构体
    首先需要定义链栈的结构体,包括一个指向栈顶节点的指针top以及一个用于存储节点数据的数组或链表。
  2. 初始化栈
    初始化栈可以通过将top指针置为NULL来实现。
  3. 判断栈是否非空
    判断栈是否非空可以通过判断top指针是否为NULL来实现。如果top指针不为NULL,则栈非空;否则,栈为空。
  4. 依次进栈元素a、b、c、d、e
    进栈操作可以通过创建新节点并将其插入到链表的头部来实现。具体步骤如下:
    a. 创建新节点并设置其数据为需要进栈的元素。
    b. 将新节点的next指针指向当前的top节点。
    c. 将top指针指向新节点。
    重复以上步骤,直到所有元素都进栈。
  5. 判断栈s是否非空
    同上,判断栈是否非空可以通过判断top指针是否为NULL来实现。
  6. 输出出栈序列
    出栈操作可以通过遍历链表并输出每个节点的数据来实现。具体步骤如下:
    a. 定义一个指针temp指向当前top节点。
    b. 将top节点从链表中删除并释放其内存。
    c. temp指针向后移动一个节点,即temp = temp->next。
    d. 输出temp指向的节点的数据。
    重复以上步骤,直到temp指针为NULL,即所有元素都出栈。
  7. 判断栈s是否非空
    同上,判断栈是否非空可以通过判断top指针是否为NULL来实现。
  8. 释放栈
    最后需要释放整个链表所占用的内存空间,包括每个节点的内存以及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;
}

五、运行结果

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

噗-噗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值