请编写程序,实现顺序栈的各种基本运算,利用菜单组织所有功能,要求实现
(1)输出栈中的所有元素;
(2)入栈:往栈中压入一个元素;
(3)出栈:从栈中退出一个元素;
(4)取栈顶:输出当前栈顶元素;
(5)求栈的长度;
(6)清空栈;
(7)销毁栈并退出系统。
#include<iostream>
#include<iomanip>
using namespace std;
typedef int Status;
typedef int ElemType;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
struct Stack
{
private:
ElemType *arr;
int top=-1;
int MaxSize = MAXSIZE;
public:
//构造函数,默认栈最大容量为100,用户也可以自己指定容量
Stack(int n = MAXSIZE);
//析构函数,释放arr数组内存并修改top和MaxSize
~Stack();
Status Display();//遍历栈,从栈顶到栈底
Status Push(const ElemType e); //压栈
Status Pop(ElemType &e); //弹栈
Status Top(ElemType& e); //得到栈顶元素
//函数体太短,直接内联函数搞定
int Size() { return top + 1; } //返回栈内元素数量
void Clear() { top = -1; } //栈内元素清零(虚假清零,直接将栈顶设回-1)
};
void Menu(); //菜单
int main()
{
Stack st;
ElemType e;
bool adjust = true;
while (adjust)
{
Menu();
int key;
cin >> key;
switch (key)
{
case 1:
cout << "x=";
cin >> e;
st.Push(e);
break;
case 2:
if (st.Pop(e))
{
cout<<"弹出元素为:" << e << endl;
}
break;
case 3:
st.Display();
break;
case 4:
if (st.Top(e))
{
cout<<"当前栈顶元素为:" << e << endl;
}
break;
case 5:
cout << "栈中共有" << st.Size() << "个数据元素\n";
break;
case 6:
char k;
cout << "确定要清空栈吗?(y or n)\n";
cin >> k;
if (k == 'y')
{
st.Clear();
cout << "栈已清零\n";
}
else if(k=='n')
{
cout << "放弃清空操作\n";
}
else
{
cout << "无效的操作\n";
}
break;
case 7:
//结束时会自动调用析构函数,不用显性使用
adjust = false;
cout << "再见!\n";
default:
break;
}
cout << endl;
}
return 0;
}
Stack::Stack(int n)
{
arr = new ElemType[n];
MaxSize = n;
}
Stack::~Stack()
{
delete[] arr;
top = -1;
MaxSize = 0;
}
Status Stack::Display()
{
if (Size() == 0)
{
cout << "栈为空\n";
return ERROR;
}
cout << "从栈顶到栈底依次是:\n";
for (int i = top; i >= 0; --i)
{
cout << arr[i]<<' ';
}
cout << endl;
return OK;
}
Status Stack::Push(const ElemType e)
{
if (Size() == MaxSize)
{
cout << "当前栈已满无法插入\n";
return OVERFLOW;
}
arr[++top] = e;
return OK;
}
Status Stack::Pop(ElemType &e)
{
if (!Size())
{
cout << "栈为空,无法弹出\n";
return ERROR;
}
e = arr[top--];
return OK;
}
Status Stack::Top(ElemType& e)
{
if (!Size())
{
cout << "栈为空,无法弹出\n";
return ERROR;
}
e = arr[top];
return OK;
}
void Menu()
{
cout <<right<< setw(17) << "顺序栈操作" << endl
<< "------------------------" << endl
<< "\t" << left << setw(10) << "1-入栈" << endl
<< "\t" << left << setw(10) << "2-出栈" << endl
<< "\t" << left << setw(10) << "3-输出栈" << endl
<< "\t" << left << setw(10) << "4-取栈顶" << endl
<< "\t" << left << setw(10) << "5-栈长" << endl
<< "\t" << left << setw(10) << "6-清空" << endl
<< "\t" << left << setw(10) << "7-退出" << endl
<< "------------------------" << endl;
}
面向对象的思路但是函数封装到了一个结构体里,但其实和类的功能差不多,反正c++也支持这样写。
析构函数是结束时自动调用的,因为我主动调用时程序能执行,但是执行完毕之后会在控制台返回一个错误的信息,不知道为什么(之前看书上说通常不应在代码中显示的调用析构函数),目前也还没有深究。