2 u013338828 u013338828 于 2016.04.01 08:44 提问

栈处理括号表达式,有个变量不知道什么用处

这是一段利用栈处理括号表达式的程序:
1. 当你看到一个左括号,直接入栈;
2. 看到一个右括号,从stack总pop对象,直到遇到左括号,左括号也pop出栈。
3. 然后将一个值作为运算结果存入栈中。

题目来源于C++ Primer,给的程序如下。

问题:
1、这里有个变量seen记录了有多少个括号,但是这个seen有什么用?
2、expr这个变量,定义为什么要定义成引用?

 int main()
{
    auto& expr = "This is (Mooophy(awesome)((((wooooooooo))))) and (ocxs) over";
    auto repl = '#';
    auto seen = 0;

    stack<char> stk;

    for (auto c : expr) {
        stk.push(c);
        if (c == '(') ++seen;   // open
        if (seen && c == ')') { // pop elements down to the stack
            while (stk.top() != '(') stk.pop();
            stk.pop();      // including the open parenthesis
            stk.push(repl); // push a value indicate it was replaced
            --seen;         // close
        }
    }

    // Test
    string output;
    for (; !stk.empty(); stk.pop()) output.insert(output.begin(), stk.top());
    cout << output << endl; // "This is # and # over"
}

1个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.01 09:40
已采纳

这是C++ PRIMER上的吧
1.感觉seen并没有起到啥作用,除非你的括号没匹配对(表达式本身就是错的),左括号漏了,可以防止一直往前读越界崩溃
2.感觉这个引用除了省点系统开销,并没有什么用。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
数据结构 栈 无括号算术表达式处理算法 C语言版
#include "seqstack.h" #include "stdio.h" #include char ch; int ExpEvaluation()/*读入一个简单算术表达式并计算 其值。operatsign和operatdata分别为运算符栈和运算 数栈OPS为运算符集合*/ {     char x,y;     char op;     int a,b,v;
c语言实现的括号匹配算法 无括号算术表达式处理算法
c语言实现的括号匹配算法 无括号算术表达式处理算法 #include "seqstack.h" #include "stdio.h" void BracketMatch(char *str); void BracketMatch(char *str) /* str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配*/ { SeqStack S; int i; char ch; InitStack(&S); for(i=0; str[i]!='\0'; i++) /*对字符串中的字符逐一扫描*/ { switch(str[i]) { case '(': case '[': case '{': Push(&S,str[i]); break; case ')': case ']': case '}': if(IsEmpty(&S)) { printf("\n右括号多余!"); return; } else { GetTop(&S,&ch;); if(Match(ch,str[i])) /*用Match判断两个括号是否匹配*/ Pop(&S,&ch;); /*已匹配的左括号出栈*/ else { printf("\n对应的左右括号不同类!"); return; } } }/*switch*/ }/*for*/ if(IsEmpty(&S)) printf("\n括号匹配!"); else printf("\n左括号多余!"); } void main() { char str[100]; printf("please input:"); gets(str); BracketMatch(str); }
java中栈的应用-带括号的算术表达式
问题分析: 表达式有中缀表达式,后缀表达式和前缀表达式; 其中中缀表达式就是我们平常写的算术表达式,而后缀表达式就是将运算符放在两个操作数之后,前缀则放在之前; 例如:中缀表达式:A+(B-C/D)*E  对应的后缀表达式就是 ABCD/-E*+,前缀类比 由于后缀表达式中无运算优先级又无括号的约束问题,因此计算一个后缀表达式比计算一个中缀表达式咬简单 1将原算术表达式转
利用栈和队列计算带有括号的表达式(纯理论)
可以使用将中缀表达式转为后缀的方法。 在这里我以一个例子来说明:先将9+(3-1)*3+10/2转为后缀表达式9 3 1 - 3 * + 10 2 / +,再通过计算后缀表达式得到20这个结果。在这里简单的介绍一下转换原则:1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号
数据结构-栈的应用-算术表达式小括号匹配
数据结构高分笔记,第3章《栈》的第一个例题,题目要求检测算术表达式中小括号匹配是否合法。感觉自己的算法还是有点弱智啊,这么多判断好像很low逼!!!! #include #include #define max 5 typedef struct { char exp[max]; int top; }sqstack; void main() { sqstack st; i
8586 括号匹配检验
今天把数据结构学习的代码拿出来和网友分享一下,应该测试能过! 8586 括号匹配检验 Time Limit:1000MS  Memory Limit:1000K Total Submit:679 Accepted:182 Type: Program   Language: Not Limited Description 利用栈编写满足下列要求的括号匹配检验程序:假设表达
解析带小括号的算术表达式--------用栈来实现的java算法
1 将中缀表达式转换成后缀表达式     2 计算后缀表达式的值
用栈判断表达式中的括号是否匹配
栈的简单应用。
如何判断一个表达式中的左右括号是否匹配
public class Bracket { static boolean isMatched(String brackets){ int string_size = brackets.length(); Stack<Character> match = new Stack<Character>(); char symbol ;
C++实现表达式求值(括号,小数点,负数)
难得闲来无事,写一篇博客岂不是美滋滋。表达式求值的思路主要是将中缀表达式转换为后缀表达式,然后由后缀表达式进行求值,这里用到的数据结构主要是栈。中缀转后缀:遍历表达式,如果是数字,就直接输出,如果是操作符,就需要判断此时栈内是否为空或者栈顶是否为左括号,如果是的话,就直接进栈,否则就需要与栈顶元素进行比较,如果优先级大于栈顶元素,直接进栈,如果小于或等于,则需要先出栈,再进栈。当遍历完整个表达式之...