user-0 提问: 错误又来了。。。

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 4 楼 我当时害怕极了QAQ 的回复:][quote=引用 3 楼 user-1 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top]; [/quot]  按照方法1和方法2修改了，还是一样的错误。。。  按理说不应该呀，我push的时候已经++top了？  只有匹配的时候才会自减  怎么会变成-1 你debug跟踪一下吧，我这边用你的代码没法再现你的错误 另外，跑你的代码时还发现一个问题，就是以下打印 cout << c[1] << "  匹配错误" << endl; 这里应该是c[i] [/quote]  嗯嗯，大佬  问题解决了，不是程序的问题  不知道是编译器的问题还是内存出了什么问题。。。  谢谢帮助

user: user-0
content: [quote=引用 3 楼 user-1 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top]; [/quot]  按照方法1和方法2修改了，还是一样的错误。。。  按理说不应该呀，我push的时候已经++top了？  只有匹配的时候才会自减  怎么会变成-1

user: user-1
content: 引用 4 楼 我当时害怕极了QAQ 的回复:[quote=引用 3 楼 user-1 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top]; [/quot]  按照方法1和方法2修改了，还是一样的错误。。。  按理说不应该呀，我push的时候已经++top了？  只有匹配的时候才会自减  怎么会变成-1 你debug跟踪一下吧，我这边用你的代码没法再现你的错误 另外，跑你的代码时还发现一个问题，就是以下打印 cout << c[1] << "  匹配错误" << endl; 这里应该是c[i]

user: user-1
content: 主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top];

user: user-0
content: 引用 1 楼 user-1 的回复:看你的用例，应该是只打印第一次不匹配的错误，所以遇到不匹配，打印后就退出循环就好了  void Bracketmatch(const char* c) //括号匹配 {     bool bj=true;     char t;     stack s1(strlen(c)+1);     for (unsigned int i = 0; i < strlen(c); i++)     {         t = c[i];         switch (t)         {         case '(':             s1.push(t);             break;         case '[':             s1.push(t);             break;         case '{':             s1.push(t);             break;         case ')':                           if (s1.top1() == '(')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         case ']':             if (s1.top1() == '[')             {                 s1.pop();                 break;             }             else             {                 cout << c[1] << "  匹配错误" << endl;                 bj = false;                 break;             }         case '}':             if (s1.top1() == '{')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         default:             break;         }         if (!bj) break; //加这一句就好了，只要有错，就不再继续往下查找匹配了     }     if (bj)     {         if (s1.empty())         {             cout << "匹配正确！" << endl;         }         else             cout << s1.top1() << "  匹配错误" << endl;     } }   还是不对  是不是stack类有问题

user: user-1
content: 看你的用例，应该是只打印第一次不匹配的错误，所以遇到不匹配，打印后就退出循环就好了  void Bracketmatch(const char* c) //括号匹配 {     bool bj=true;     char t;     stack s1(strlen(c)+1);     for (unsigned int i = 0; i < strlen(c); i++)     {         t = c[i];         switch (t)         {         case '(':             s1.push(t);             break;         case '[':             s1.push(t);             break;         case '{':             s1.push(t);             break;         case ')':                           if (s1.top1() == '(')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         case ']':             if (s1.top1() == '[')             {                 s1.pop();                 break;             }             else             {                 cout << c[1] << "  匹配错误" << endl;                 bj = false;                 break;             }         case '}':             if (s1.top1() == '{')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         default:             break;         }         if (!bj) break; //加这一句就好了，只要有错，就不再继续往下查找匹配了     }     if (bj)     {         if (s1.empty())         {             cout << "匹配正确！" << endl;         }         else             cout << s1.top1() << "  匹配错误" << endl;     } }