错误又来了。。。

孤远无梦 2020-10-23 07:32:53
/*课后习题1.8-h

h. 假设表达式中允许包含3中括号:圆括号、方括号和大括号。
设计一个算法采用顺序栈判断表达式中的括号是否正确配对。
void Bracketmatch(const char* c)

*/
#include <iostream>
#include <cstring>
#include <string>

using namespace std;
class stack {
private:
int maxsize;
int top;
char* st;

public:



stack(int size)
{
maxsize = size;
top = -1;
st = new char[maxsize];
}

void push(char item)
{
st[++top] = item;
}

char top1()
{
return st[top];
}

void pop()
{
top--;
}

bool empty()
{
return top == -1;
}
};
/*
TODO:计一个算法采用顺序栈判断表达式c中的括号是否正确配对。
输出:1. 遍历表达式c过程中,匹配错误 cout << c[i] << " 匹配错误" << endl;
2. 遍历之后,栈为空,则匹配正确,cout << "匹配正确!" << endl;
若不为空,则 cout << s1.top1() << " 匹配错误" << endl;
*/
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)
{
if (s1.empty())
{
cout << "匹配正确!" << endl;
}
else
cout << s1.top1() << " 匹配错误" << endl;
}
}

int main()
{

string s;
getline(cin, s);
Bracketmatch(s.c_str());
return 0;
}


运行结果不对

这个要求写那个匹配函数,其他地方应该是不让改的

这里是几个用例

用例1:
假设输入为:
{1*[3*2+(2-1)]}
则输出为:
匹配正确!

用例2:
假设输入为:
{}{[]()()()()[]{{{}}}
则输出为:
{ 匹配错误

用例3:
假设输入为:
{1*[3*2+(2-1)}]
则输出为:
} 匹配错误

用例4:
假设输入为:
(1*(3-(3*[3%[4=[t }5}7-}i9]73]24]5-)6)+)6*)5%{6*{3^{2!!(
则输出为:
} 匹配错误

用例5:
假设输入为:
) ] } { ] (
则输出为:
) 匹配错误

...全文
180 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤远无梦 2020-10-25
  • 打赏
  • 举报
回复
引用 5 楼 qybao 的回复:
[quote=引用 4 楼 我当时害怕极了QAQ 的回复:][quote=引用 3 楼 qybao 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空,所以就会造成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] 嗯嗯,大佬 问题解决了,不是程序的问题 不知道是编译器的问题还是内存出了什么问题。。。 谢谢帮助
孤远无梦 2020-10-24
  • 打赏
  • 举报
回复
[quote=引用 3 楼 qybao 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空,所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空,比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断,比如 if(top==-1) return -1; return st[top]; [/quot] 按照方法1和方法2修改了,还是一样的错误。。。 按理说不应该呀,我push的时候已经++top了? 只有匹配的时候才会自减 怎么会变成-1
qybao 2020-10-24
  • 打赏
  • 举报
回复
引用 4 楼 我当时害怕极了QAQ 的回复:
[quote=引用 3 楼 qybao 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空,所以就会造成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]
qybao 2020-10-23
  • 打赏
  • 举报
回复
主要是你判断栈顶元素的时候没有判断栈是否为空,所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空,比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断,比如 if(top==-1) return -1; return st[top];
孤远无梦 2020-10-23
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
看你的用例,应该是只打印第一次不匹配的错误,所以遇到不匹配,打印后就退出循环就好了
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类有问题
qybao 2020-10-23
  • 打赏
  • 举报
回复
看你的用例,应该是只打印第一次不匹配的错误,所以遇到不匹配,打印后就退出循环就好了

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

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧