394. 字符串解碼(C++)---棧解題(文中有有關棧的介紹和方法總結)

目錄

有關棧的介紹和方法總結

頭文件

棧的常用函數有



題目詳情

給定一個經過編碼的字符串,返回它解碼後的字符串。

編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。

你可以認爲輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認爲原始數據不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。
 

示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".


——題目難度:中等


 


 

這次的題目讓我知道了這類有關括號的匹配的題目,就應當先考慮用棧來解決問題。
因爲棧“先進後出”的性質 很適合 這種匹配的題目。
 

有關棧的介紹和方法總結

棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表,這一端被稱爲棧頂,相對地,把另一端稱爲棧底。向一個棧插入新元素又稱作進棧入棧壓棧,它是把新元素放到棧頂元素的上面,使之成爲新的棧頂元素從一個棧刪除元素又稱作出棧退棧,它是把棧頂元素刪除掉,使其相鄰的元素成爲新的棧頂元素
 

 

頭文件


C++ 使用STL棧stack時 所需要包含的頭文件爲 <stack>



棧的常用函數有:


push(elem)   將元素elem入棧
pop()   移除棧頂元素(刪除)
top()   返回棧頂元素(不刪除)

empty()   判度棧是否爲空
size()   求棧內元素的個數

 


 

- 下面代碼

class Solution {
public:
    string decodeString(string s) {
		int len = s.size(), num = 0;
		string ans = "";
		/*nums中每個元素存儲對應的'['前的數字*/
		stack<int> nums;  
		/*strs中每個元素先用來存儲對應的'['前的字符串,後面當遇到']'時暫時用作其他功能 */
		stack<string> strs;
		
		for(auto ch: s)
		{
			if(ch >= '0' && ch<='9') {
				num = num*10 + ch-'0';
			}
			else if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z') {
				ans += ch;
			}
			else if(ch == '[') { //將'['前的數字和字符串 分別 壓入對應的棧中
				nums.push(num);
				num = 0;
				
				strs.push(ans);
				ans = "";
			}
			else if(ch == ']') { //將num和strs的棧頂元素出棧
				int times = nums.top();
				nums.pop(); //移除棧頂元素 
				
				for(int i=0; i<times; i++)
				{
					strs.top() += ans;
				}
				ans = strs.top();
				
				strs.pop(); //移除棧頂元素 
			}
		}
				
		return ans;
    }
};


結果

 

 

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