栈的使用 LeetCode 20&150

LeetCode 20. 有效的括号

给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "([)]"
输出: false
示例 2:
输入: "{[]}"
输出: true

思路

将左括号推入栈中,当遇到右括号时,查看是否与栈顶元素匹配,不匹配返回false,匹配将栈顶元素出栈。

注意:匹配时要注意判断栈中是否还有元素

操作完全部括号后,栈中没有元素,则说明匹配成功。

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> stack;
        if(s.size()==0) return true;
        stack.push(s[0]);
        for(int i=1; i<s.size(); i++)
        {
        	//分两种情况讨论
			//1.右括号,看下是否匹配
			//2.左括号,将其入栈 
        	if(s[i]==')' || s[i]=='}'|| s[i]==']')
        	{
        		if(stack.size()==0) return false; //"[])"
        		char top = stack.top();
        		char match;
        		if(s[i]==')') match='(';
        		else if(s[i]=='}') match='{';
        		else match='[';
        		if(match != top) return false;
        		stack.pop();
        	}else
        		stack.push(s[i]);
        }
        if(stack.size()==0) return true;
        return false;
    }
};

LeetCode 150. 逆波兰表达式求值


根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6

思路

使用栈模拟计算过程

遍历整个数则,当遇到符号的时候,从栈中取出两个元素进行运算,并且将计算后的结果推入栈中

代码

class Solution {
public:
	int strToInt(string s)
	{
		int begin = 0;
		if(s[0]=='-') begin=1;
		int sum = 0;
		for(int i=begin; i<s.size(); i++)
		{
			sum = sum*10 + s[i]-'0';
		}
		if(begin==1) return -1*sum;
		return sum;
	}
	string intToStr(int d)
	{
		bool flag = false;//判断是否为负数 
		if(d<0)
		{
			flag=true; 
			d=-1*d;	
		} 
		if(d==0) return "0";
		string s="";
		while(d!=0)
		{
			char c = d%10+'0';
			s=c+s;
			d=d/10;
		}
		if(flag) s="-"+s;
		return s;
	}
    int evalRPN( vector<string>& tokens) {
		//使用栈模拟,将数字放入栈中
		//当遇到符号时,从栈头弹出两个元素进行操作,将结果入栈
		int n = tokens.size();
		if(n==0) return 0;
		stack<string> stack;
		for(int i=0; i<tokens.size(); i++)
		{
			if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*"|| tokens[i]=="/")
			{
				int last = strToInt(stack.top());
				stack.pop();
				int pre = strToInt(stack.top());
				stack.pop();
				int res = 0;
				if(tokens[i]=="+")
					res = pre+last;
				else if(tokens[i]=="-")
					res = pre-last;
				else if(tokens[i]=="*")
					res = pre*last;
				else
					res = pre/last;
				stack.push(intToStr(res));
			}else
			{
				stack.push(tokens[i]);
			}	
		} 
		return strToInt(stack.top());
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章