括号匹配问题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
思路:当栈为空时入栈,没遇到左括号时一直入栈。当出现左括号时比较与栈顶元素是否匹配,如果匹配则出栈。在完成后如果栈仍然不为空则说明存在不互相匹配的括号。
#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();
}
};