数据结构实验 4 顺序栈的实现

一、实验目的

1.掌握顺序栈的定义和特性。

2.掌握顺序栈的初始化、创建、取栈顶元素、销毁、打印、入栈、出栈等基本操作。

4. 了解顺序栈相较于顺序表的特殊性,能在不同情况下选择合适的存储方式。

二、实验要求

1. 写出顺序栈的操作的详细算法步骤;

2. 使用C/C++实现顺序栈,并编译运行。

三、实验过程

实验环境:visual studio 2017

实验步骤:

  1. 初始化顺序栈S,定义函数名为Init_Stack;
  2. 创建顺序栈S,定义函数名为Create_Stack;
  3. 取顺序栈S的栈顶元素,定义函数名为Get_Top;
  4. 销毁顺序栈S,定义函数名为Destory_Stack;
  5. 打印顺序栈S,定义函数名为Print_Stack;
  6. 元素入栈,定义函数名为Push;
  7. 栈顶元素出栈,定义函数名为Pop;

Stack.h

#define ELEMTYPE int   //用#define定义一个标识符ELEMTYPE表示int
#define MAXSIZE 10     //用#define定义一个标识符MAXSIZE表示10
#include<stdio.h>      //调用头文件
#include<stdlib.h>     //调用头文件

typedef struct           //构建一个结构体存储顺序栈信息
{
	ELEMTYPE* data;      //定义一个数组存放顺序栈中的元素
	int top;             //定义一个整型变量存放栈顶元素的下标
}Stack;             	 //结构名为Stack

void Init_Stack(Stack* S);    		 //声明初始化函数-Init_Stack
void Creat_Stack(Stack* S);   		 //声明创建函数-Creat_Stack
int Get_Top(Stack S);	      		 //声明取栈顶元素函数-Get_Top
void Destory_Stack(Stack* S); 		 //声明销毁函数-Destory_Stack
void Print_Stack(Stack S);    		 //声明打印函数-Print_Stack
void Push(Stack* S, ELEMTYPE e);     //声明入栈函数-Push
void Pop(Stack* S,ELEMTYPE* e);      //声明出栈函数-Pop

Stack.c

#include "Stack.h"    		 //调用头文件

void Init_Stack(Stack* S)    //初始化顺序栈
{
	S->data = (ELEMTYPE*)malloc(sizeof(ELEMTYPE)*MAXSIZE);    //开辟一块空间存放栈
	S->top = -1;    			    //顺序栈长度为0时top设置为-1
}

void Creat_Stack(Stack* S)    		//创建顺序栈
{
	int length;						//定义整型变量length表示顺序栈长度
	printf("Please input the length:");     //提示输入顺序栈长度
	scanf("%d", &length);                   //输入顺序栈长度
	printf("\n");                           //换行
	S -> top = length - 1;				    //栈顶元素的下标为栈长-1
	for (int n = 0; n <= S->top; n++)       //向顺序栈输入length个元素
	{
		printf("Please input the data:");   //提示输入顺序栈元素
		scanf("%d", &S->data[n]);           //输入顺序表元素
	}
	printf("\n");                           //换行
}

int Get_Top(Stack S)						//取栈顶元素
{
	return S.data[S.top];					//返回栈顶元素
}

void Destory_Stack(Stack* S)				//销毁顺序栈
{
	free(S->data);							//释放顺序栈S所占用空间
	S->data = NULL;							//指针S置为空
}

void Print_Stack(Stack S)				    //输出顺序栈
{
	printf("The stack is:");    		    //提示输出顺序栈
	for (int n = 0; n <= S.top; n++)        //遍历顺序栈
	{
		printf("%d ", S.data[n]);           //打印栈的元素
	}
	printf("\n");   						//换行
}

void Push(Stack* S,ELEMTYPE e)				//元素e入栈
{
	if (S->top >= MAXSIZE - 1)				//如果栈满
	{
		printf("push failed\n");			//提示入栈失败
		return;								//退出函数
	}								
	S->data[++S->top] = e;		            //栈顶插入元素e并更新栈顶元素的下标
}

void Pop(Stack* S,ELEMTYPE* e)				//栈顶元素出栈
{
	if(S->top==-1)							//顺序栈S为空
	{
		printf("pop failed\n");				//提示出栈失败
		return;								//退出函数
	}
	*e = S->data[S->top];					//栈顶元素赋值给*e
	S->top--;								//更新栈顶元素的下标
}

以下为测试函数

1.测试初始化函数Init_Stack;创建函数Create_Stack;打印函数Print_Stack.

#include "Stack.h"    //调用头文件

int main(void)        //main()函数
{
	Stack S;            //定义一个顺序表L
	Init_Stack(&S);     //调用Init_Stack函数将顺序栈S初始化
	Creat_Stack(&S);    //调用Creat_Stack函数创建顺序栈S
	Print_Stack(S);     //调用Print_Stack函数打印顺序栈S
	return 0;           //返回值
}

2.测试销毁函数Destory_Stack.

#include "Stack.h"    //调用头文件

int main(void)        //main()函数
{
	Stack S;          	//定义一个顺序表L
	Init_Stack(&S);      //调用Init_Stack函数将顺序栈S初始化
	Creat_Stack(&S);     //调用Creat_Stack函数创建顺序栈S
	Print_Stack(S);      //调用Print_Stack函数打印顺序栈S
	Destory_Stack(&S);	 //调用Destory_Stack函数销毁顺序栈S
	Print_Stack(S);      //调用Print_Stack函数打印顺序栈S
	return 0;            //返回值
}

3.测试入栈函数Push.

#include "Stack.h"          //调用头文件

int main(void)          	//main()函数
{
	Stack S;          	 //定义一个顺序表L
	Init_Stack(&S);      //调用Init_Stack函数将顺序栈S初始化
	Creat_Stack(&S);     //调用Creat_Stack函数创建顺序栈S
	Print_Stack(S);      //调用Print_Stack函数打印顺序栈S
	ELEMTYPE e;			 //定义ELEMTYPE类型变量e表示待入栈元素
	printf("Please input the element you want to push:");		//提示输入待入栈元素
	scanf("%d", &e);				 //输入待入栈元素
	Push(&S,e);					     //调用Push函数将元素e入栈
	Print_Stack(S);     			 //调用Print_Stack函数打印顺序栈S
	return 0;          			     //返回值
}

4.测试出栈函数Pop.

#include "Stack.h"   	 //调用头文件

int main(void)    		 //main()函数
{
	Stack S;          	 //定义一个顺序表L
	Init_Stack(&S);      //调用Init_Stack函数将顺序栈S初始化
	Creat_Stack(&S);     //调用Creat_Stack函数创建顺序栈S
	Print_Stack(S);      //调用Print_Stack函数打印顺序栈S
	ELEMTYPE e;		   	 //定义ELEMTYPE类型变量e表示待出栈元素
	Pop(&S,&e);	 		 //调用Push函数将栈顶元素出栈
	Print_Stack(S);      //调用Print_Stack函数打印顺序栈S
	return 0;          	 //返回值
} 

四、实验结果及分析

测试函数

测试用例

运行结果

Init_Stack Creat_Stack

Print_Stack

5

1,2,3,4,5

Please input the length:5

Please input the data:1

Please input the data:2

Please input the data:3

Please input the data:4

Please input the data:5

The stack is:1 2 3 4 5

0

Please input the length:0

The linked list is:

Destory_Stack

5

1,2,3,4,5

Please input the length:5

Please input the data:1

Please input the data:2

Please input the data:3

Please input the data:4

Please input the data:5

The stack is:1 2 3 4 5

The stack is:

0

Please input the length:0

The stack is:

The stack is:

Push

原栈栈满

1

Please input the element you want to push:1

push failed

The stack is:1 2 3 4 5 6 7 8 9 10

原栈未满

1

Please input the element you want to push:1

The stack is:1 2 3 4 5 1

Pop

原栈栈空

Please input the length:0

The stack is:

pop failed

The stack is:

原栈未空

Please input the length:5

Please input the data:1

Please input the data:2

Please input the data:3

Please input the data:4

Please input the data:5

The stack is:1 2 3 4 5

The stack is:1 2 3 4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Binkkkk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值