栈OJ(C++)

1.最小栈

在这里插入图片描述

class MinStack
{
public:
	MinStack()
	{

	}
	void push(int val)
	{
		_st.push(val);
		//empty放在前面 因为栈为空时top会assert
		if (_mst.empty() || val <= _mst.top())
			_mst.push(val);
	}
    //注意代码顺序
	void pop()
	{
		if (_mst.top() == _st.top())
			_mst.pop();
		_st.pop();
	}
	int top()
	{
		return _st.top();
	}
	int getMin()
	{
		return  _mst.top();
	}
private:
	stack<int> _st;
	stack<int> _mst;
};

2.栈的压入、弹出序列

在这里插入图片描述

class Solution
{
	//pushV:压栈顺序组
	// popV:出栈顺序组
	bool IsPopOrder(vector<int> pushV, vector<int> popV)
	{
		stack<int> st;
		int i = 0;
		//遍历压栈组
		for (auto x : pushV)
		{
			st.push(x);
			//top前一定判空
			while (!st.empty() && popV[i] == st.top())
			{
				//st非空前提下 判断出栈组与栈顶是否相同
				//相同i后移 -- 可视为出栈正确 -- 继续遍历
				++i;
				//将符合的栈顶数据弹出
				st.pop();

				//继续循环 -- 压栈到中途 -- 连续出栈 
				//此时就会有多组匹配
			}
		}
		//若出栈顺序正确 -- 此时下标i与size大小同
		//return i == popV.size();
		return st.empty();
	}
};

3.逆波兰表达式(后缀表达式)求值

3.1后缀表达式求值

在这里插入图片描述
在这里插入图片描述

class Solution 
{
public:
	//Evaluate inverse Polish notation
	int evalRPN(vector<string>& tokens)
	{
		stack<long long> st;
		for (auto& str : tokens)
		{
			if (str == "+" || str == "-" 
			 || str == "*" || str == "/" )
			{
				long long right = st.top();
				st.pop();
				long long left = st.top();
				st.pop();
				switch (str[0])
				{
				case '+':
					st.push(left + right);
					break;
				case '-':
					st.push(left - right);
					break;
				case '*':
					st.push(left * right);
					break;
				case '/':
					st.push(left / right);
					break;
				}
			}
			else
			{
				st.push(stoll(str));
			}
		}
		return st.top();
	}
};

3.2中缀表达式转后缀表达式

1.操作数输出
2.操作符:
2.1栈为空或此操作符比栈顶操作符优先级高:压栈
2.2此操作符比栈顶操作符优先级低或相等:输出并pop

3.3带有括号的中缀表达式转后缀表达式

1.操作数输出
2.操作符:
2.1栈为空或此操作符比栈顶操作符优先级高:压栈
2.2此操作符比栈顶操作符优先级低或相等:输出并pop
2.3若遇到左括号:此后的第一个操作符默认运算级最高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿猿收手吧!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值