回 帖 发 新 帖 刷新版面

主题:一个初学者的郁闷……不会做~~急急急

假设一个算术表达式中可以包含三种括号:圆括号"("和")"、方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入字符的顺序表中)。

能给我一个参考吗???急急急………………谢谢[em10]

回复列表 (共10个回复)

沙发

初学者就研究这个了。。。

一个堆栈的题目。研究一下栈。

板凳


没办法,还要上台解说!!!哎~~这次死定了~~
[em10]

3 楼

只是检查匹配的话实现很简单的,大致思路如下:
遇到左括号则入栈,遇到右括号则与栈顶比较,如果匹配则继续,如果不匹配则说明表达式有误,退出即可。

4 楼

一个简单的方法:
分别给出3个整数变量,对应3种括号。
然后遍历整个已知表达式,碰到(或者【或者{就把对应的那个整数加一,遇到)或者]或者}就把对应的那个整数减一。这样到最后遍历完整个表达式后,看看三个整数分别是多大,如果是0,说明对应的那种括号是匹配的。
其实就是栈的策略了。

5 楼

[quote]初学者就研究这个了。。。

一个堆栈的题目。研究一下栈。[/quote]

他的意思让你每次看到左括号就进栈,碰到右括号时出栈,并且判断出栈的类型是不是和右括号的类型相同。

6 楼

[quote]一个简单的方法:
分别给出3个整数变量,对应3种括号。
然后遍历整个已知表达式,碰到(或者【或者{就把对应的那个整数加一,遇到)或者]或者}就把对应的那个整数减一。这样到最后遍历完整个表达式后,看看三个整数分别是多大,如果是0,说明对应的那种括号是匹配的。
其实就是栈的策略了。[/quote]

你这种方法存在问题,比如下面的式子:
a+3*[(2+3]-3)

7 楼

#include<stdio.h>
#define MaxSize 100
int Match(char* str)
{
    char St[MaxSize];
    int top=-1;
    int j,k;
    j=0;
    while(str[j]!='\0')
    {
     switch(str[j])
     {
     case '(':
     case '[':
     case '{':St[++top]=str[j];break;
     case ')':if(St[top]!='(') k=0;
              else{ top--;k=1;}break;
     case ']':if(St[top]!='[') k=0;
              else{ top--;k=1;}break;
     case '}':if(St[top]!='{') k=0;
              else{ top--;k=1;}break;
     default:break; 
     }
     if(k==0)break;
     j++;
    }
    return k;
}
void main()
{
    char str[MaxSize];
    scanf("%s",str);
    if(Match(str))
          printf("match");
    else 
          printf("not match");
}
调试一下,看对不对

8 楼

行,非常感谢~~!![em12][em4][em5]

9 楼

版主别忘了,给帮你的人加分哦

10 楼

我怎么觉得k没有初始化呢,万一输入没有括号或者只有左括号,k的值就不好说了。
似乎应该在j=0;后加k=-1;在return k; 前加
if (k==-1) k=0;

我来回复

您尚未登录,请登录后再回复。点此登录或注册