逆波表达式的求解代码(前缀和后缀表达式,括号匹配问题)

1.前缀、中缀和后缀表达式

如果大家对这些表达式还不知道的话,可以参考资料

2.逆波兰(后缀)表达式求解

在这里我们以LeetCode上的一道面试题为例,题目描述如下图:

解题思路很明确,在求解后缀表达式的时候,我们可以选用栈这种结构,遇到数字入栈,遇到符号连续出栈两次,并将运算结果入栈。接下来看下代码是如何实现的。

# include<iostream>
using namespace std;
# include<string>
# include<vector>
# include<stack>
int evalRPN(vector<string>& tokens) 
{
	stack<int> s;
	for (auto ele : tokens)
	{
		if (ele.size() == 1 && (ele[0] == '+' || ele[0] == '-' || ele[0] == '*' || ele[0] == '/'))
		{
			int value1 = s.top();
			s.pop();
			int value2 = s.top();
			s.pop();
			switch (ele[0])
			{
			case '+':
				s.push(value2 +value1);
				break;
			case '-':
				s.push(value2-value1);
				break;
			case '*':
				s.push(value2 * value1);
				break;
			case '/':
				s.push(value2 / value1);
				break;
			}
		
		}
		else
		{
			s.push(atoi(ele.c_str()));
			
		}
	}
	return s.top();
}
int main()
{
	vector<string> tokens;
	tokens.push_back("2");
	tokens.push_back("1");
	tokens.push_back("+");
	tokens.push_back("3");
	tokens.push_back("*");
	
	cout << evalRPN(tokens);
	return 0;
}

3.括号匹配问题

问题描述:

给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请编写程序检查该字符串的括号是否成对出现。

输出:

          true:代表括号成对出现并且嵌套正确,或字符串无括号字符。

          false:未正确使用括号字符。


我们可以巧妙的使用栈来解决这个问题,当遍历到右括号时,栈顶元素必须是左括号才能出栈,否则入栈。

bool Match(string str)
{
	stack<char> s;
	for (auto ele : str)
	{
		if (ele == '{' || ele == '[' || ele == '(')
		{
			s.push(ele);
		}
		else
		{ 
			switch (ele)
			{
			case '}':
				if (s.top() == '{')
					s.pop();
				break;
			case ']':
				if (s.top() == '[')
					s.pop();
				break;
			case ')':
				if (s.top() == '(')
					s.pop();
				break;
			}
		}
	}
	return  s.empty() ? true : false;
}
发布了124 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42214953/article/details/104835195