主题:一个初学者的郁闷……不会做~~急急急
marnble
[专家分:0] 发布于 2006-10-18 22:53:00
假设一个算术表达式中可以包含三种括号:圆括号"("和")"、方括号“[”和“]”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入字符的顺序表中)。
能给我一个参考吗???急急急………………谢谢[em10]
回复列表 (共10个回复)
沙发
argentmoon [专家分:13260] 发布于 2006-10-18 23:04:00
初学者就研究这个了。。。
一个堆栈的题目。研究一下栈。
板凳
marnble [专家分:0] 发布于 2006-10-19 00:12:00
没办法,还要上台解说!!!哎~~这次死定了~~
[em10]
3 楼
boxertony [专家分:23030] 发布于 2006-10-19 07:50:00
只是检查匹配的话实现很简单的,大致思路如下:
遇到左括号则入栈,遇到右括号则与栈顶比较,如果匹配则继续,如果不匹配则说明表达式有误,退出即可。
4 楼
realcrane [专家分:190] 发布于 2006-10-19 09:51:00
一个简单的方法:
分别给出3个整数变量,对应3种括号。
然后遍历整个已知表达式,碰到(或者【或者{就把对应的那个整数加一,遇到)或者]或者}就把对应的那个整数减一。这样到最后遍历完整个表达式后,看看三个整数分别是多大,如果是0,说明对应的那种括号是匹配的。
其实就是栈的策略了。
5 楼
willzhanglala [专家分:1350] 发布于 2006-10-19 15:40:00
[quote]初学者就研究这个了。。。
一个堆栈的题目。研究一下栈。[/quote]
他的意思让你每次看到左括号就进栈,碰到右括号时出栈,并且判断出栈的类型是不是和右括号的类型相同。
6 楼
boxertony [专家分:23030] 发布于 2006-10-19 19:07:00
[quote]一个简单的方法:
分别给出3个整数变量,对应3种括号。
然后遍历整个已知表达式,碰到(或者【或者{就把对应的那个整数加一,遇到)或者]或者}就把对应的那个整数减一。这样到最后遍历完整个表达式后,看看三个整数分别是多大,如果是0,说明对应的那种括号是匹配的。
其实就是栈的策略了。[/quote]
你这种方法存在问题,比如下面的式子:
a+3*[(2+3]-3)
7 楼
pentiumchen [专家分:70] 发布于 2006-10-21 16:26:00
#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 楼
marnble [专家分:0] 发布于 2006-10-27 16:39:00
行,非常感谢~~!![em12][em4][em5]
9 楼
公之它 [专家分:170] 发布于 2006-10-29 13:53:00
版主别忘了,给帮你的人加分哦
10 楼
leolhc [专家分:430] 发布于 2006-10-29 16:51:00
我怎么觉得k没有初始化呢,万一输入没有括号或者只有左括号,k的值就不好说了。
似乎应该在j=0;后加k=-1;在return k; 前加
if (k==-1) k=0;
我来回复