<实例>消除内嵌括号——使用栈实现

来源:互联网 发布:网络营销软件 编辑:程序博客网 时间:2024/05/21 17:05

题目:给定一个如下格式的字符串(1,(2,3),(4,(5,6),7))括号内的元素可以是数字,也可以是另一个括号,请实现一个算法消除嵌套的括号,比如把上面的表达式变成:(1,2,3,4,5,6,7),如果表达式有误请报错。

解题思路:下面解法的大前提是括号必须是匹配的

有几个点需要注意: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);}
结果:



0 0
原创粉丝点击