C++面试笔试必知必会-栈的常见问题

13 篇文章 0 订阅
3 篇文章 0 订阅


一、有效的括号(力扣20题)

在这里插入图片描述

bool isValid(string s) {
        int n=s.size();
        if(n%2!=0) return false;
        stack<char> cs;

        for(char ch : s)
        {
            if(ch=='('||ch=='['||ch=='{')
            {
                cs.push(ch);
            }
            else
            {
                if(cs.empty()) return false;

                char cmp=cs.top();
                cs.pop();
                if(ch==')'&&cmp!='('||ch==']'&&cmp!='['||ch=='}'&&cmp!='{')
                {
                     return false;
                }
            }
        }

        return cs.empty();
    }

二、逆波兰表达式求值(力扣150题)

在这里插入图片描述

int evalRPN(vector<string>& tokens) {
        int sum=0;
        stack<int> s;

        for(string &str :tokens)
        {
            if(str.size()==1&&(str[0]=='+'||str[0]=='-'||str[0]=='*'||str[0]=='/'))
            {
                int r=s.top();
                s.pop();
                int l=s.top();
                s.pop();
               s.push(calc(l,r,str[0]));
            }
            else
            {
                s.push(stoi(str));
            }
        }

        return s.top();
    }

三、中缀转后缀表达式

#include<iostream>
#include<string>
#include<stack>
using namespace std;

//比较符号优先级
bool Priority(char ch, char topch)
{
	if ((ch == '*' || ch == '/') && (topch == '+' || topch == '-'))
		return true;
	if (topch == '('&&ch!=')')
		return true;
	return false;
}


//中缀表达式转后缀表达式
string MiddleToEndExpr(string expr)
{
	string result;
	stack<char> s;

	for (char ch : expr)
	{
		if (ch >= '0' && ch <= '9')
		{
			result.push_back(ch);
		}
		else//处理符号
		{
			while (1)
			{
					if (s.empty() || ch == '(')
					{
						s.push(ch);
						break;
					}
					//比较当前符号ch和栈顶符号top的优先级
					char topch = s.top();
					//true ch>topch   false ch<=topch
					if (Priority(ch, topch))
					{
						s.push(ch);
						break;
					}
					else
					{
						s.pop();
						if (topch == '(') break;
						result.push_back(topch);
					}
			}
		}
	}
	//如果符号栈还存留符号,直接输出到后缀表达式里面
	while (!s.empty())
	{
		result.push_back(s.top());
		s.pop();
	}
	return result;
}

int main() {
	cout << MiddleToEndExpr("(1+2)*(3+4)") << endl;
	cout << MiddleToEndExpr("2+(4+6)/2+6/3") << endl;

	return 0;
}

总结

今天主要给大家说了一些,栈的常用算法题,主要利用了栈先进后出的概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值