目录
一、顺序栈
顺序栈实际上和顺序表是十分类似的,都是对数组知识点的运用,但是与顺序表不同的是,我们限制了数据的入栈与出栈只能从一侧来进行。遵循后进先出的原则。
二、顺序表操作
2.1、初始化
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct
{
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //顺序
//初始化栈
void InitStack(SqStack& S)
{
S.top = -1; //初始化栈顶元素
}
int main()
{
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
}
这里我们在结构体里声明了top来记录栈顶元素,初始化为-1,因为数组序号是从0开始记录,0号数组对应第一个入栈元素。
2.2、入栈
//新元素入栈
bool Push(SqStack& S)
{
int n,x;
cout << "请输入入栈元素个数" << endl;
cin >> n;
if (n > MaxSize)
{
cout << "超出最大容量" << endl;
return false;
}
if (S.top == MaxSize - 1) //栈满报错
return false;
for (int i = 0; i < n; i++)
{
cout << "请输入第"<<i+1<<"个入栈元素" << endl;
cin >> x;
S.top = S.top + 1;
S.data[S.top] = x;
//以上两句可以合并为 S.data[++S.top] = x;
}
return true;
}
这里就是考察对数组的熟练使用,需要注意的是入栈元素不要超过我们定义的最大入栈元素。
2.3、出栈
//出栈操作
bool Pop(SqStack& S)
{
int n;
int x;
cout << "请输入出栈元素个数" << endl;
cin >> n;
if (S.top == -1)
{
return false;
}
for (int i = 0; i < n; i++)
{
x = S.data[S.top];
S.top = S.top - 1;
//以上两句可以合并为 x = S.data[S.top--];
}
return true;
}
2.4、获取栈顶元素
//读取栈顶元素
bool GetTop(SqStack S )
{
int x;
if (S.top <= -1)
{
cout << "栈空" << endl;
return false;
}
x = S.data[S.top]; //x记录栈顶元素
cout << "栈顶元素为:" << x << endl;
return false;
}
2.5、判空操作
bool StackEmpty(SqStack S)
{
if (S.top == -1)
{
cout << "栈空,请操作....." << endl;
return true;
}
else
{
cout << "栈非空" << endl;
return false;
}
}
三、完整代码
#include<iostream>
using namespace std;
#define MaxSize 10 //定义栈中元素的最大个数
//顺序存储实现的栈
//创(初始化)
//增(进栈)
//删(出栈)
//查(获取栈顶元素)
//判空 判满
typedef struct
{
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //顺序
//初始化栈
void InitStack(SqStack& S)
{
S.top = -1; //初始化栈顶元素
}
//判断栈空
bool StackEmpty(SqStack S)
{
if (S.top == -1)
{
cout << "栈空,请操作....." << endl;
return true;
}
else
{
cout << "栈非空" << endl;
return false;
}
}
//新元素入栈
bool Push(SqStack& S)
{
int n,x;
cout << "请输入入栈元素个数" << endl;
cin >> n;
if (n > MaxSize)
{
cout << "超出最大容量" << endl;
return false;
}
if (S.top == MaxSize - 1) //栈满报错
return false;
for (int i = 0; i < n; i++)
{
cout << "请输入第"<<i+1<<"个入栈元素" << endl;
cin >> x;
S.top = S.top + 1;
S.data[S.top] = x;
//以上两句可以合并为 S.data[++S.top] = x;
}
return true;
}
//出栈操作
bool Pop(SqStack& S)
{
int n;
int x;
cout << "请输入出栈元素个数" << endl;
cin >> n;
if (S.top == -1)
{
return false;
}
for (int i = 0; i < n; i++)
{
x = S.data[S.top];
S.top = S.top - 1;
//以上两句可以合并为 x = S.data[S.top--];
}
return true;
}
//读取栈顶元素
bool GetTop(SqStack S )
{
int x;
if (S.top <= -1)
{
cout << "栈空" << endl;
return false;
}
x = S.data[S.top]; //x记录栈顶元素
cout << "栈顶元素为:" << x << endl;
return false;
}
//打印顺序栈
void PrintSqStack(SqStack S)
{
cout << "此时的顺序栈为" << endl;
for (int i = 0; i < S.top+1; i++)
{
cout << S.data[i] << " - ";
}
cout << "null" << endl;
}
int main()
{
SqStack S; //声明一个顺序栈(分配空间)
InitStack(S);
StackEmpty(S);
Push(S);
PrintSqStack(S);
Pop(S);
GetTop(S);
PrintSqStack(S);
return 0;
}