目录
前言
有言:学而不练,练而不坚。对于知识,我们都应该学有所练,练有所用。所以我又来啦!今天给大家分享的是顺序栈,希望这篇博客对大家有帮助和参考价值。新CSDNER,不当之处还望指正。
一、顺序栈是什么?
顺序栈是栈的顺序实现。顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间(数组)依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,而栈底位置是固定不变的,可以将栈底位置设置在数组空间的起始处;栈顶位置是随入栈和出栈操作而变化的,故需用一个整型变量top来记录当前栈顶元素在数组中的位置。
二、顺序栈的基本操作代码实例
1、头文件准备(定义数组、下标)
#include<stdio.h>
#include<stdlib.h>
#define Stack_Size 50
//顺序表存储
typedef struct
{
//定义数组存放数据
int data[Stack_Size];
// top用于存放下标
int top;
}SqStack;
2、栈的初始化
//栈的初始化
bool InitStack(SqStack &s)
{
//top=-1时,为空
s.top=-1;
return true;
}
3、判断表空、表满
s)
{
if(s.top==-1)
return true;
else
return false;
}
//判断是否为满
bool isFullStack(SqStack s)
{
if(s.top==Stack_Size-1)
return true;
else
return false;
}
4、进栈、出栈
(对于不同的字符进栈需要改变变量的定义,该代码以int输入,若为字符可改char)
//进栈
bool Push(SqStack &s,int x)
{
//栈满
if(isFullStack(s)==1)
return false;
else
{
//修改栈顶指针
s.top++;
//x进栈
s.data[s.top]=x;
return true;
}
}
//出栈
bool Pop(SqStack &s,int &x)
{
//栈为空
if(isEmpyStack(s)==1)
return false;
else
{
//栈顶元素赋给x
x=s.data[s.top];
//修改栈顶指针
s.top--;
return true;
}
}
5、读取栈顶元素
//读取栈顶元素
bool GetTop(SqStack &s,int &x)
{
//栈为空
if(isEmpyStack(s)==1)
return false;
else
{
//栈顶元素赋给x
x=s.data[s.top];
return true;
}
}
6、求顺序表的表长
//求顺序栈的长度(栈内的元素个数)
int LengthStack(SqStack s)
{
return(s.top+1);
}
7、清空栈
//清空栈
void ClearStack(SqStack &s)
{
s.top=-1;
printf("栈已清空\n");
}
8、打印顺序栈
//打印栈
void printStack(SqStack s)
{
int i,x;
for(i=LengthStack(s);i>0;i--)
{
Pop(s,x);
printf("%2d",x);
}
printf("\n");
}
9、主函数
#include<stdio.h>
#include<stdlib.h>
#define Stack_Size 50
//顺序表存储
typedef struct
{
//定义数组存放数据
int data[Stack_Size];
// top用于存放下标
int top;
}SqStack;
//栈的初始化
bool InitStack(SqStack &s)
{
//top=-1时,为空
s.top=-1;
return true;
}
//判断是否为空
bool isEmpyStack(SqStack s)
{
if(s.top==-1)
return true;
else
return false;
}
//判断是否为满
bool isFullStack(SqStack s)
{
if(s.top==Stack_Size-1)
return true;
else
return false;
}
//进栈
bool Push(SqStack &s,int x)
{
//栈满
if(isFullStack(s)==1)
return false;
else
{
//修改栈顶指针
s.top++;
//x进栈
s.data[s.top]=x;
return true;
}
}
//出栈
bool Pop(SqStack &s,int &x)
{
//栈为空
if(isEmpyStack(s)==1)
return false;
else
{
//栈顶元素赋给x
x=s.data[s.top];
//修改栈顶指针
s.top--;
return true;
}
}
//读取栈顶元素
bool GetTop(SqStack &s,int &x)
{
//栈为空
if(isEmpyStack(s)==1)
return false;
else
{
//栈顶元素赋给x
x=s.data[s.top];
return true;
}
}
//求顺序栈的长度(栈内的元素个数)
int LengthStack(SqStack s)
{
return(s.top+1);
}
//清空栈
void ClearStack(SqStack &s)
{
s.top=-1;
printf("栈已清空\n");
}
//打印栈
void printStack(SqStack s)
{
int i,x;
for(i=LengthStack(s);i>0;i--)
{
Pop(s,x);
printf("%2d",x);
}
printf("\n");
}
int main()
{
SqStack s;
InitStack(s);
int x,y;
//元素进栈
printf("请输入需要进栈的元素(999结束):\n");
scanf("%d",&x);
while(x!=999)
{
Push(s,x);
scanf("%d",&x);
}
//判断是否为空
if(isEmpyStack(s)==1)
printf("该栈为空\n");
else
printf("该栈不为空\n");
//判断是否已满
if(isFullStack(s)==1)
printf("该栈已满\n");
else
printf("该栈未满\n");
//顺序栈的长度
LengthStack(s);
printf("顺序栈的长度为:%d\n",LengthStack(s));
//栈顶元素
GetTop(s,y);
printf("栈顶元素是:%d\n",y);
//元素出栈
Pop(s,x);
printf("出栈的元素为:%d\n",x);
//打印
printf("此时栈中的元素为:\n");
printStack(s);
ClearStack(s);
}
运行结果
总结
该代码运用的数组知识,布尔型、if语句等。目前该程序已实现这些基本操作,并进行的测试。后续如有更多操作,会继续更新。