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

前言

在这里插入图片描述

题目描述

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k
保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

题目解析

思想:借助栈
和上一题类似,知道了用栈之后就要去分情况考虑了
首先考虑需要的变量: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值