供下一届参考
#define MaxSize 30
using namespace std;
typedef struct Stack
{
int* base; //栈底指针 不变
int* top; //栈顶指针 一直在栈顶元素上一个位置;
int stacksize; //栈可用的最大容量;
}SqStack;
//初始化栈
int InitStack(SqStack& s)
{
s.base = new int[100]; //动态分配最大容量;
if (!s.base)
{
cout << "分配失败" << endl;
return 0;
}
s.top = s.base; //栈顶指针与栈底指针相同;
s.stacksize = MaxSize;
return 1;
}
//入栈功能
void PushToStack(SqStack &s)
{
int n, e, flag;
cout << "请输入需要入栈的元素个数:" << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
if (s.top - s.base == MaxSize)
{
cout << "栈满,出栈" << endl;
}
cout << "请输入元素的值:" << endl;
cin >> e;
*(s.top++) = e; //这里如果是*(++s.top)则*(s.base)是未知数字;
}
}
//出栈功能
void PopFromStack(SqStack& s)
{
int n, flag, e;
cout << "请输入需要出栈的元素个数:" << endl;
cin >> n;
for (int i = 0; i < n; i++)
{
if (s.top == s.base)
{
cout << "栈已空" << endl;
return;
}
e = *(--s.top); //先减减 指向栈顶元素,再给e
cout << e << "已出栈" << endl;
}
}
//遍历栈
void TraveStack(SqStack s)
{
while (s.base != s.top)
cout << *(--s.top) << " ";
if (s.base == s.top)
{
cout << "栈已完成遍历" << endl;
return;
}
}
//清空栈
void ClearStack(SqStack& s)
{
s.top = s.base;
return;
}
//销毁栈
void DestroyStack(SqStack& s)
{
s.top = NULL;
s.stacksize = 0;
delete(s.base);
return;
}
//菜单;
void menu()
{
cout << "--------------------1.入栈 2.出栈--------------------" << endl;
cout << "--------------------3.遍历栈 4.清空、销毁、退出--------" << endl;
}
//主函数
int main()
{
SqStack s;
int choice;
InitStack(s);
while (1)
{
menu();
cout << "请输入菜单序号:" << endl;
cin >> choice;
if (choice == 4)
break;
switch (choice)
{
case 1:
PushToStack(s); break;
case 2:
PopFromStack(s); break;
case 3:
TraveStack(s); break;
case 4:
ClearStack(s); break;
DestroyStack( s); break;
exit(0);
default:
cout << "输入错误,请重新输入" << endl;
break;
}
}
return 0;
}