#include<stdio.h>
#include<iostream>
using namespace std;
#define MaxSize 128 //预先分配空间,这个数值根据实际需要预估确定
typedef int ElemType;
typedef struct _QStack {
ElemType* base; //栈底指针
ElemType* top; //栈顶指针
}QStack;
//采用top指向栈顶元素的方法
#define MAXSIZE 50 //定义栈中元素的最大个数
bool InitStack(QStack& S);
bool PushStack(QStack& S, ElemType e);
bool PopStack(QStack& S, ElemType& e);
bool GetTop(QStack& S, ElemType e);
bool Input(QStack S);
void StackShow(QStack& S);
bool InitStack(QStack& S) { //构造一个空栈 S(初始化)
S.base = new ElemType[MaxSize];//为顺序栈分配一个最大容量为 Maxsize 的空间
if (!S.base) return false; //空间分配失败
S.top = S.base; //top 初始为 base,空栈
return true;
}
bool PushStack(QStack& S, ElemType e) { // 插入元素 e 为新的栈顶元素
if (S.top - S.base == MaxSize) //栈满
return false;
*(S.top++) = e; //元素 e 压入栈顶,然后栈顶指针加 1;
Input(S);
return true;
}
bool PopStack(QStack& S, ElemType& e) //删除 S 的栈顶元素,暂存在变量 e中
{
if (S.base == S.top) { //栈空
return false;
}
e = *(--S.top); //栈顶指针减 1,将栈顶元素赋给 e
Input(S);
return true;
}
bool GetTop(QStack& S, ElemType e) { //返回 S 的栈顶元素,栈顶指针不变
if (S.top != S.base) { //栈非空
e = *(S.top - 1);
return true;
}
else {
return false;
}
}
bool Input(QStack S)//打印栈空间
{
ElemType* p;
p = S.top;
if (S.base == p)
{
cout << "栈空了哈(*^-^)" << endl;
return false;
}
cout << "---------栈空间内存展示-------------------------" << endl;
cout << "----栈顶----" << endl;
for (p--; p >= S.base; p--)
cout << "=>" << *p << " (" << p << ")" << endl;
cout << "----栈底----" << endl;
return true;
}
void StackShow(QStack& S)
{
char* p;
p = (char*)S.top;
char* end = (char*)S.base;
int k = 0;
if (end == p)
{
cout << "顺序栈为空!" << endl;
return;
}
cout << "---------栈空间内存展示-------------------------\n" << endl;
for (p; p >= end; p -= 8) {
printf("--> %p %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx\n", p, *(p + 7), *(p + 6), *(p + 5), *(p + 4), *(p + 3), *(p + 2), *(p + 1), *(p));
}
cout << endl;
return;
}
int main()
{
QStack S;
int a;
ElemType e = 0;;
if (!InitStack(S))
cout << "顺序栈初始化失败!" << endl;
else
cout << "顺序栈初始化成功!" << endl;
while (1)
{
cout << "\n【1】入栈 【2】出栈 【3】读栈顶元素 【4】输出栈 【0】退出" << endl;
cout << "请选择要进行的操作:";
cin >> a;
switch (a)
{
case 1:
cout << "请输入入栈元素:";
cin >> e;
if (!PushStack(S, e))
cout << "栈满了哈(*^-^)" << endl;
else
cout << "元素" << e << "入栈成功!" << endl;
break;
case 2:
if (!PopStack(S, e))
cout << "栈空了哈(*^-^)" << endl;
else
cout << "元素" << e << "出栈成功!" << endl;
break;
case 3:
if (!GetTop(S, e))
cout << "栈空了哈(*^-^)" << endl;
else
cout << "栈顶元素为:" << e << endl;
break;
case 4:
StackShow(S);
break;
default:
return 0;
}
}
return 0;
}```