一、实验目的
1.掌握顺序栈的定义和特性。
2.掌握顺序栈的初始化、创建、取栈顶元素、销毁、打印、入栈、出栈等基本操作。
4. 了解顺序栈相较于顺序表的特殊性,能在不同情况下选择合适的存储方式。
二、实验要求
1. 写出顺序栈的操作的详细算法步骤;
2. 使用C/C++实现顺序栈,并编译运行。
三、实验过程
实验环境:visual studio 2017
实验步骤:
- 初始化顺序栈S,定义函数名为Init_Stack;
- 创建顺序栈S,定义函数名为Create_Stack;
- 取顺序栈S的栈顶元素,定义函数名为Get_Top;
- 销毁顺序栈S,定义函数名为Destory_Stack;
- 打印顺序栈S,定义函数名为Print_Stack;
- 元素入栈,定义函数名为Push;
- 栈顶元素出栈,定义函数名为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 |