棧的使用 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());
    }
};

 

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