C语言实现顺序栈
前言
最近在复习数据结构和C语言,就想照着自己的理解继续盲打代码。本次是实现了一个顺序栈,也就是采用静态分配的方式,这种方式实现起来比较简单。
后续还会练习实现链栈等数据结构。
栈是一种后进先出的数据结构,只允许在一端(栈顶)访问元素。
实现的功能
- 初始化栈
- 入栈
- 出栈
- 获取栈顶元素
主界面截图
栈的定义
typedef int ElemType;//给数据类型取别名,此次存的是int类型,如果要存为其他类型只需要修改此处一次
//-------结构体定义部分------ //
typedef struct{
ElemType data[MaxSize];
int top;//指向栈顶元素的指针
int length;//栈中实际存储的元素个数
}MyStack;
因为是顺序栈,所以用普通数组的方式存储,我自己定义了一个length变量,可以根据这个变量来判断栈满栈空等。
**栈空:**top = -1 或 length = 0
**栈满:**top = MaxSize -1 或 length = MaxSize
栈的初始化
//栈的初始化
bool InitStack(MyStack *S)
{
//栈的初始化需要把栈顶指针赋值为-1,此时栈中元素个数为0
S->top = -1;
S->length = 0;
return true;
}
入栈
只有栈不满才能入栈,所以需要先判断是否栈满。入栈时需要先将栈顶指针+1,再执行入栈操作。
//入栈
bool Push(MyStack *S,ElemType e)
{
if(S->top == MaxSize -1) //如果栈满 也可以判断 length==MaxSize
return false;
else
S->data[++S->top] = e;//指针先加一再将元素入栈
(S->length)++; //栈中元素加一
return true;
}
出栈
同上,只有栈不空才能出栈。出栈时先获取出栈元素在将栈顶指针-1.
//出栈
bool Pop(MyStack *S)
{
ElemType x;//用x将出栈的结果输出
if(S->top == -1)//栈空 也可以判断 length==0
return false;
else
x = S->data[S->top--];//先获得元素,指针再执行--操作
printf("此次出栈的元素为:%d\n",x);
(S->length)--; //栈中元素减一
return true;
}
获取栈顶元素
获取栈顶元素就是直接访问栈顶指针此时指向的元素。
//获取当前栈顶元素
bool GetTop(MyStack *S,int *x)
{
if(S->top == -1)//如果栈空,则没有栈顶元素
return false;
else
//printf("当前栈顶元素为:%d\n",S->data[S->top]);
*x = S->data[S->top];//获得栈顶元素
return true;
}
全部代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> //根据C99标准,C语言使用bool类型需要添加这个头文件
#define MaxSize 10 //顺序栈这里使用静态分配的方式,所以手动规定最大容量
typedef int ElemType;//给数据类型取别名,此次存的是int类型,如果要存为其他类型只需要修改此处一次
//-------结构体定义部分------ //
typedef struct{
ElemType data[MaxSize];
int top;//指向栈顶元素的指针
int length;//栈中实际存储的元素个数
}MyStack;
//-------结构体定义部分------ //
//-------函数声明部分------ //
void MainMenu();
bool InitStack(MyStack *S);//栈的初始化
bool Push(MyStack *S,ElemType e);//将元素e压入栈
bool Pop(MyStack *S);//出栈
bool GetTop(MyStack *S,int *x);//获取当前栈顶元素
//-------函数声明部分------ //
int main()
{
int ch;//选择操作指令
int element;//入栈的元素
int x;//获取出栈的元素
MyStack S;
InitStack(&S);//初始化一个栈
while(1)
{
MainMenu();
printf("请输入您要执行的操作:");
scanf("%d",&ch);
switch(ch)
{
case 0: printf("感谢使用,已退出!"); exit(0); break;
case 1: printf("请输入您要入栈的元素:\n");
scanf("%d",&element);
if(Push(&S,element))
printf("入栈成功!\n");
else
printf("入栈失败!栈已满!\n");
break;
case 2:
if(Pop(&S))
printf("出栈成功!\n");
else
printf("出栈失败!栈已空!\n");
break;
case 3:
if(GetTop(&S,&x))
printf("获取栈顶成功!当前栈顶元素为:%d\n",x);
else
printf("获取栈顶失败!栈已空!\n");
break;
default: printf("您输入的操作指令有误!请重新输入!");
}
}
return 0;
}
//主菜单,显示
void MainMenu()
{
printf("\n\n\n");
printf("\t *************顺序栈的实现************\n\n");
printf("\t ------- 0.退出 \n\n");
printf("\t ------- 1.将数据入栈\n\n");
printf("\t ------- 2.执行一次出栈操作\n\n");
printf("\t ------- 3.获取当前栈顶元素\n\n");
printf("\t *************************************\n");
}
//栈的初始化
bool InitStack(MyStack *S)
{
//栈的初始化需要把栈顶指针赋值为-1,此时栈中元素个数为0
S->top = -1;
S->length = 0;
return true;
}
//入栈
bool Push(MyStack *S,ElemType e)
{
if(S->top == MaxSize -1) //如果栈满 也可以判断 length==MaxSize
return false;
else
S->data[++S->top] = e;//指针先加一再将元素入栈
(S->length)++; //栈中元素加一
return true;
}
//出栈
bool Pop(MyStack *S)
{
ElemType x;//用x将出栈的结果输出
if(S->top == -1)//栈空 也可以判断 length==0
return false;
else
x = S->data[S->top--];//先获得元素,指针再执行--操作
printf("此次出栈的元素为:%d\n",x);
(S->length)--; //栈中元素减一
return true;
}
//获取当前栈顶元素
bool GetTop(MyStack *S,int *x)
{
if(S->top == -1)//如果栈空,则没有栈顶元素
return false;
else
//printf("当前栈顶元素为:%d\n",S->data[S->top]);
*x = S->data[S->top];//获得栈顶元素
return true;
}
功能测试
栈满栈空测试可以自己多输入几个或多出栈几次就知道了。