c++解决括号匹配及逆波兰表达式

括号匹配问题

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
    在这里插入图片描述
    思路:当栈为空时入栈,没遇到左括号时一直入栈。当出现左括号时比较与栈顶元素是否匹配,如果匹配则出栈。在完成后如果栈仍然不为空则说明存在不互相匹配的括号。
#include<stdlib.h>
#include<stack>
#include<iostream>
using namespace std;
class Solution{
public:
	bool isValid(string s)
	{
	stack<char> s1;
	for(char ch:s)
	{
	if(s1.empty()
		s1.push(ch);
	else if(s1.top=='('&&ch==')')
		s1. pop();
	else if(s1.top()=='['&&ch==']')
		s1.pop();
	else if(s1.top()=='{'&&ch=='}')
		s1.pop();
	else
		s1.push(ch);
	}
	return s1.empty();
	}
};
int main()
{
 Solution a;
 string s = "{[{(){}}]";
 if (a.isValid(s))
  cout << "匹配" << endl;
 cout << "不匹配" << endl;
 system("pause");
}

逆波兰(后缀)表达式

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
思想:将数字入到一个栈s1中,遇到二元运算符时通过top()取出两个栈顶数字进行运算,运算完成后将所得结果入栈继续,直到数组为空。
在这里插入图片描述
在这里插入图片描述


class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        if(tokens.empty())
            return 0;
      stack<int> s1;
      for(int i=0;i<tokens.size();i++)
      {
          if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/")
            {
                int res=0;
                int a=s1.top();
                s1.pop();
                int b=s1.top();
                s1.pop();
                if(tokens[i]=="+")
                    res=b+a;
                else if(tokens[i]=="-")
                    res=b-a;
                else if(tokens[i]=="*")
                    res=b*a;
                else if(tokens[i]=="/")
                    res=b/a;
                s1.push(res);
            }       
            else
                s1.push(stoi(tokens[i]));       
      }
        return s1.top();
    }
                  
};
发布了39 篇原创文章 · 获赞 4 · 访问量 1149

猜你喜欢

转载自blog.csdn.net/qq_41403559/article/details/97918891