top指向栈顶元素本身:
/*
栈:只允许在一段进行插入或删除操作的线性表
顺序栈:用顺序存储方式实现的栈
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 5 //定义顺序栈最大长度
#define ElemType int
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //顺序栈类型定义 sq:sequence顺序
//初始化顺序表
void InitStack(SqStack& S) {
S.top = -1;
}
/*
此种设定下:
栈顶指针:S.top(指向栈顶元素)
初始时设置:S.top = -1
栈顶元素:S.data[S.top]
栈空:S.top == -1
栈满:S.top == MaxSize - 1
栈长:S.top + 1
进栈操作:栈不满时,栈顶指针先+1,再送值到栈顶元素
出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针-1
*/
//判空
bool StackEmpty(SqStack S) {
if (S.top == -1) return true;
else return false;
}
//要注意的是,需要改动栈本身的时候一定要加&
//入栈
bool Push(SqStack& S, ElemType x) {
if (S.top == MaxSize - 1) return false; //栈满
S.top = S.top + 1;
S.data[S.top] = x;
return true;
}
bool Push2(SqStack& S, ElemType x) {
if (S.top == MaxSize - 1) return false; //栈满
S.data[++S.top] = x;
return true;
}
//出栈
bool Pop(SqStack& S, ElemType& x) {
if (S.top == -1) return false; //栈空
x = S.data[S.top];
S.top = S.top - 1;
return true;
}
bool Pop2(SqStack& S, ElemType& x) {
if (S.top == -1) return false; //栈空
x = S.data[S.top--];
return true;
}
//读取栈顶元素
bool GetTop(SqStack S, ElemType& x) {
if (S.top == -1) return false;
x = S.data[S.top];
return true;
}
//以上所有基本操作时间复杂度为O(1)
//销毁(因为采用的是变量声明的方式分配得内存空间 未使用malloc函数 存储空间的回收由系统自动完成 故只需要完成清空操作即可)
void DestroyStack(SqStack &S) {
S.top = -1;
}
int main() {
SqStack S;
InitStack(S);
int x;
bool sign;
cout << "请连续输入要入栈的值 空格分界 999结束:\n";
scanf_s("%d", &x);
while (x != 999) {
sign = Push(S, x);
if (sign == false) {//由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生栈上溢,此时应及时向用户报告消息
cout << "栈最大容量为:" << MaxSize << ",当前栈已满,超出部分未入栈\n";
break;
}
scanf_s("%d", &x);
}
int top;
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop(S, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop2(S, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
return 0;
}
top指向栈顶元素下一位置:
/*
栈:只允许在一段进行插入或删除操作的线性表
顺序栈:用顺序存储方式实现的栈
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 5 //定义顺序栈最大长度
#define ElemType int
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //顺序栈类型定义 sq:sequence顺序
//初始化顺序表
void InitStack(SqStack& S) {
S.top = 0;
}
/*
此种设定下:
栈顶元素的位置:S.top - 1
初始时设置:S.top = 0
栈顶元素:S.data[S.top - 1]
栈空:S.top == 0
栈满:S.top == MaxSize
栈长:S.top
进栈操作:栈不满时,先送值到栈顶元素,栈顶指针再+1
出栈操作:栈非空时,先将栈顶指针-1,再取栈顶元素值
*/
//判空
bool StackEmpty(SqStack S) {
if (S.top == 0) return true;
else return false;
}
//要注意的是,需要改动栈本身的时候一定要加&
//入栈
bool Push(SqStack& S, ElemType x) {
if (S.top == MaxSize) return false; //栈满
S.data[S.top] = x;
S.top = S.top + 1;
return true;
}
bool Push2(SqStack& S, ElemType x) {
if (S.top == MaxSize) return false; //栈满
S.data[S.top++] = x;
return true;
}
//出栈
bool Pop(SqStack& S, ElemType& x) {
if (S.top == 0) return false; //栈空
S.top = S.top - 1;
x = S.data[S.top];
return true;
}
bool Pop2(SqStack& S, ElemType& x) {
if (S.top == 0) return false; //栈空
x = S.data[--S.top];
return true;
}
//读取栈顶元素
bool GetTop(SqStack S, ElemType& x) {
if (S.top == 0) return false;
x = S.data[S.top - 1];
return true;
}
//以上所有基本操作时间复杂度为O(1)
//销毁(因为采用的是变量声明的方式分配得内存空间 未使用malloc函数 存储空间的回收由系统自动完成 故只需要完成清空操作即可)
void DestroyStack(SqStack& S) {
S.top = 0;
}
int main() {
SqStack S;
InitStack(S);
int x;
bool sign;
cout << "请连续输入要入栈的值 空格分界 999结束:\n";
scanf_s("%d", &x);
while (x != 999) {
sign = Push(S, x);
if (sign == false) {//由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生栈上溢,此时应及时向用户报告消息
cout << "栈最大容量为:" << MaxSize << ",当前栈已满,超出部分未入栈\n";
break;
}
scanf_s("%d", &x);
}
int top;
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop(S, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop2(S, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
return 0;
}
共享顺序栈:
/*
栈:只允许在一段进行插入或删除操作的线性表
共享顺序栈:用顺序存储方式实现的栈,且两个栈共享同一个存储空间
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 10 //定义顺序栈最大长度
#define ElemType int
typedef struct {
ElemType data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}SqStack; //顺序栈类型定义 sq:sequence顺序
//初始化顺序表
void InitStack(SqStack& S) {
S.top0 = -1;
S.top1 = MaxSize;
}
/*
此种设定下:
栈顶指针:S.top0、S.top1 (分别指向各自栈顶元素)
初始时设置:S.top0 = -1 S.top1 = MaxSize
栈顶元素:S.data[S.top0]、S.data[S.top1]
栈空:S.top0 == -1/S.top1 == MaxSize
栈满:S.top0 + 1 == S.top1
进栈操作:栈不满时,栈顶指针先+1(对0号栈) -1(对1号栈),再送值到栈顶元素
出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针-1(对0号栈) +1(对1号栈)
*/
//判空
bool StackEmpty(SqStack S,int i) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (i == 0) {
if (S.top0 == -1) return true;
else return false;
}
else if (i == 1) {
if (S.top1 == MaxSize) return true;
else return false;
}
}
//要注意的是,需要改动栈本身的时候一定要加&
//入栈
bool Push(SqStack& S,int i, ElemType x) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (S.top0 + 1 == S.top1) return false; //栈满
if (i == 0) {
S.top0 = S.top0 + 1;
S.data[S.top0] = x;
return true;
}
else if (i == 1) {
S.top1 = S.top1 - 1;
S.data[S.top1] = x;
return true;
}
}
bool Push2(SqStack& S,int i, ElemType x) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (S.top0 + 1 == S.top1) return false; //栈满
if(i == 0)
S.data[++S.top0] = x;
else if (i == 1)
S.data[--S.top0] = x;
return true;
}
//出栈
bool Pop(SqStack& S,int i, ElemType& x) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (i == 0) {
if (S.top0 == -1) return false; //栈空
x = S.data[S.top0];
S.top0 = S.top0 - 1;
return true;
}
else if (i == 1) {
if (S.top1 == MaxSize) return false; //栈空
x = S.data[S.top1];
S.top1 = S.top1 + 1;
return true;
}
}
bool Pop2(SqStack& S,int i, ElemType& x) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (i == 0) {
if (S.top0 == -1) return false; //栈空
x = S.data[S.top0--];
return true;
}
else if (i == 1) {
if (S.top1 == MaxSize) return false; //栈空
x = S.data[S.top1++];
return true;
}
}
//读取栈顶元素
bool GetTop(SqStack S,int i, ElemType& x) {
if (i != 0 && i != 1) {
cout << "栈号指定错误 程序退出\n";
exit(0);
}
if (i == 0) {
if (S.top0 == -1) return false; //栈空
x = S.data[S.top0];
return true;
}
else if (i == 1) {
if (S.top1 == MaxSize) return false; //栈空
x = S.data[S.top1];
return true;
}
}
//销毁(因为采用的是变量声明的方式分配得内存空间 未使用malloc函数 存储空间的回收由系统自动完成 故只需要完成清空操作即可)
void DestroyStack(SqStack& S) {
S.top0 = -1;
S.top1 = MaxSize;
}
int main() {
SqStack S;
InitStack(S);
int x;
bool sign;
cout << "请连续输入要入栈0的值 空格分界 999结束:\n";
scanf_s("%d", &x);
while (x != 999) { //实际测试发现,如果此处数值数就已经超过MaxSize break,则后续包含999在内的屏幕数值并未被读取,但会被下面的scanf_s继续读取,其实算个小bug
sign = Push(S,0, x);
if (sign == false) {//由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生栈上溢,此时应及时向用户报告消息
cout << "栈最大容量为:" << MaxSize << ",当前栈已满,超出部分未入栈\n";
break;
}
scanf_s("%d", &x);
}
cout << "请连续输入要入栈1的值 空格分界 999结束:\n";
scanf_s("%d", &x);
while (x != 999) {
sign = Push(S, 1, x);
if (sign == false) {//由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生栈上溢,此时应及时向用户报告消息
cout << "栈最大容量为:" << MaxSize << ",当前栈已满,超出部分未入栈\n";
break;
}
scanf_s("%d", &x);
}
int top;
cout << "------下面操作栈0------\n";
sign = GetTop(S,0, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop(S,0, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S,0, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop2(S,0, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S,0, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
cout << "------下面操作栈1------\n";
sign = GetTop(S, 1, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop(S, 1, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, 1, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
sign = Pop2(S, 1, top);
if (sign == true)
cout << "出栈元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,出栈失败\n";
sign = GetTop(S, 1, top);
if (sign == true)
cout << "当前栈顶元素为:" << top << "\n";
else if (sign == false)
cout << "栈空,读取栈顶元素失败\n";
return 0;
}