<实例>消除内嵌括号——使用栈实现
2014-06-24 10:05
399 查看
题目:给定一个如下格式的字符串(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。
解题思路:下面解法的大前提是括号必须是匹配的
有几个点需要注意:1.输入不应该为空
2.输入的左括号数和右括号数要匹配
3.第一个出现的应该是左括号
解题思路:下面解法的大前提是括号必须是匹配的
有几个点需要注意:1.输入不应该为空
2.输入的左括号数和右括号数要匹配
3.第一个出现的应该是左括号
#include <iostream> #include <string> #include <stack> using namespace std; void format_turn(string str) { stack<char> brace; //括号栈 stack<char> num; //数字栈 stack<char> result; //结果栈 //输入字符串如果为空,则返回 if(str.empty()) { cout<<"表达式有误:输入不能为空"<<endl; return; } //根据每个字符进行相应的栈操作 for(string::size_type i=0; i<str.size(); i++) { if( str[i]>='1' && str[i]<='9' ) //如果是1-9字符,压入数字栈中 num.push( str[i] ); else if( str[i] == '(' ) //如果是(,则直接压入括号栈 brace.push( str[i] ); else if( str[i] == ')' ) //如果是),先判断括号栈是否为空,空则缺少对应(,非空则将栈顶元素弹出 { if( !brace.empty() ) { brace.pop(); } else { cout<<"表达式有误:缺少左括号"<<endl; return; } } } //对字符串全部操作后,判断括号栈是否为空,如果不为空,则表示缺少对应括号,报错; //如果为空,则表示括号全部去除,将数字栈中数据压入结果栈 if( !brace.empty() ) { cout<<"表达式有误:缺少右括号"<<endl; return; } else { while( !num.empty() ) { result.push( num.top() ); num.pop(); } } //输出最终结果 while( !result.empty() ) { cout<<result.top()<<' '; result.pop(); } cout<<endl; } void main() { string str; cout<<"请按规定格式输入:"; getline( cin, str ); cout<<"去嵌套括号后输出为:"; format_turn(str); }结果:
相关文章推荐
- <实例>C++ 将一句话里的单词进行倒置,标点符号不倒换——使用string库实现
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- <Android>使用ScrollView 实现 ListView 的下拉刷新
- <Unity UGUI>使用c#反射实现UGUI文本显示的国际化
- 使用<<jquery+html5+css>>实现的20个酷的视觉大背景网站设计
- <Android>在Activity被非正常杀死并重建时,使用savedInstanceState进行数据恢复的简单实例
- <web前端>当背景图片为渐变色图片时,为避免浏览器大小问题,可以选择使用<CSS>实现渐变色,教程如下
- HTML5 - 经典的上中下三段式布局(并使用<nav>实现侧边导航链接)
- 使用<input type="file">实现文件上传
- AJAX跨域方法之一—使用<script>实现
- 一个分解字符串函数strtok 实现(不使用<string.h>)
- 最简单的struts2中使用<s:iterator>实现隔行变色代码[珍藏版]
- <activity>元素的android:launchMod属性的使用
- Android UI 优化 使用<include/>和 <merge />标签
- fedora 16 使用LiveCD修复grub2引导–<转>
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>
- 写一个MyList<T>的类,内部用T[]实现(不能使用系统的List<T>类),需要实现的接口如下:
- 为何要使用<merge\>标签
- <Ibatis in action>中使用动态SQL的一个小细节提示(与CDATA)
- <备忘1000> ffmpeg命令行使用例子