顺序表实现栈操作 c++

请编写程序,实现顺序栈的各种基本运算,利用菜单组织所有功能,要求实现
(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++也支持这样写。
析构函数是结束时自动调用的,因为我主动调用时程序能执行,但是执行完毕之后会在控制台返回一个错误的信息,不知道为什么(之前看书上说通常不应在代码中显示的调用析构函数),目前也还没有深究。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下坠丷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值