搜索
您的当前位置:首页正文

每天6道题之第十三题:字符串解码(栈)

来源:星星旅游

前言

题目描述

题目解析

思想:借助栈
和上一题类似,知道了用栈之后就要去分情况考虑了
首先考虑需要的变量:stack s1; int num;string res;
(1)当前遍历的是左括号时:将num当前res内容进栈 (在这里可以利用双栈)同时清空res和num
(2) 当前遍历的是右括号时:弹出栈顶状态并进行组合,
在这里组合值得是num倍的res里面的字符串 然后放在栈顶状态中的字符后面 此时要记得删除栈顶元素。
(3)当前遍历的是数字时:将其变为整型存在num中
(4)当前遍历的是字母时: 置res=此字母,并将num=0

完整代码

//题解:借助栈
//和上一题类似,知道了用栈之后就要去分情况考虑了
//首先考虑需要的变量:stack<string> s1; int num;string res;   
//(1)当前遍历的是左括号时:将num当前res内容进栈 (在这里可以利用双栈)同时清空res和num 
//(2) 当前遍历的是右括号时:弹出栈顶状态并进行组合, 
//		在这里组合值得是num倍的res里面的字符串 然后放在栈顶状态中的字符后面  此时要记得删除栈顶元素。 
//(3)当前遍历的是数字时:将其变为整型存在num中 
//(4)当前遍历的是字母时: 置res=此字母,并将num=0 

#include<iostream>
#include<stack>
#include<string>
using namespace std;

class Solution{
	public:
		string decodeString(string s){
			stack<int> numstack;
			stack<string> strstack;
			int num;
			string res="";
			for(int i=0;i<s.length();i++){
				if((s[i]>='A' &&s[i]<='Z') || (s[i]>='a' && s[i]<='z')){
					res=res+s[i];
				}
				else if(s[i]=='['){
					numstack.push(num);
					strstack.push(res);
					num=0;
					res="";
				}
				else if(s[i]==']'){
					int k=numstack.top();
					numstack.pop();
					for(int j=0;j<k;j++){
						strstack.top()+=res;
					}
					res=strstack.top();
					strstack.pop();
					
				}
				else{
					num = 10*num+s[i]-'0';//不能硬变  s[i]-'0'是相对位置,得到的数值就是0-9
					//比如如果s[i]=9 那么变为数值就是'9'-'0'=9  但是如果这个时候 s[i]的前面是1,也就是说现在这个真正的num=19
					//那么遍历到1的时候执行这个代码num=1,遍历到9的时候,num=10+9=19. 
					
				}
				
				
				
			}
			return res;
		}
};

int main(){
	string s;
	cin>>s;
	string res=Solution().decodeString(s);
	cout<<res<<endl;
	return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top