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;
    }
};


结果

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ 中,使用 Poco 库的 `Base64Decoder` 类解码 UTF-8 编码的字符串,可以按照以下步骤进行: 1. 将 UTF-8 编码的字符串转换为 UTF-16 编码的字符串。 ```c++ #include <string> #include <codecvt> std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; std::wstring utf16Str = converter.from_bytes(utf8Str); // utf8Str 是 UTF-8 编码的字符串 ``` 在上述代码中,我们使用 `std::wstring_convert` 类和 `std::codecvt_utf8_utf16` 类型的模板参数将 UTF-8 编码的字符串转换为 UTF-16 编码的字符串。需要注意的是,上述代码需要包含头文件 `<string>` 和 `<codecvt>`。 2. 使用 `Base64Decoder` 类解码 UTF-16 编码的字符串。 ```c++ #include <sstream> #include "Poco/Base64Decoder.h" std::wstring result; std::wstringstream ss; Poco::Base64Decoder decoder(ss); decoder << utf16Str; // utf16Str 是 UTF-16 编码的字符串 decoder.close(); ss >> result; ``` 在上述代码中,我们使用 `std::wstringstream` 类将 UTF-16 编码的字符串写入到 `Base64Decoder` 类的输入流中,然后通过 `decoder.close()` 方法关闭输入流,并将解码后的结果写入到 `std::wstring` 类型的变量 `result` 中。 最后,我们可以将解码后的 UTF-16 编码的字符串再次转换为 UTF-8 编码的字符串: ```c++ std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> utf8converter; std::string utf8Result = utf8converter.to_bytes(result); ``` 在上述代码中,我们使用 `std::wstring_convert` 类和 `std::codecvt_utf8_utf16` 类型的模板参数将 UTF-16 编码的字符串转换为 UTF-8 编码的字符串,然后将结果存储到 `utf8Result` 变量中。需要注意的是,上述代码需要包含头文件 `<string>` 和 `<codecvt>`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重剑DS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值