永发信息网

数据结构:括号匹配问题。

答案:3  悬赏:10  手机版
解决时间 2021-02-11 18:01
假设一个算术表达式中允许包含两种括号:()[] 其嵌套的次序随意,请设计一个算法判断一个算术表达式中的括号是否匹配
最佳答案
//用栈做的
#include
#include
#include

typedef struct _stack
{
char *base;
char *top;
int num;
}Sqstack;

void InitStack(Sqstack &s)
{
s.base=(char *)malloc(100*sizeof(char));
if(s.base==NULL)
{
printf("栈创建失败!\n");
return;
}
s.top=s.base;
*s.top=0;
s.num=100;
}
void push(Sqstack &s,char k)
{
if((s.top-s.base)>=s.num)
{
printf("栈已满!\n");
return;
}
*s.top++=k;
}

void pop(Sqstack &s)
{
if(s.base==s.top)
{
printf("该栈是空栈!\n");
return;
}
s.top--;
}

bool Isempty(Sqstack &s)
{
if(s.base==s.top)
return true;
return false;
}

bool Match(Sqstack &s)
{
char str[100];
int i;
printf("请输入括号串:");
scanf("%s",str);
for(i=0;i {
switch(str[i])
{
case '[':
push(s,'[');
break;
case ']':
if(*(s.top-1)=='[')
pop(s);
else
return false;
break;
case '(':
push(s,'(');
break;
case ')':
if(*(s.top-1)=='(')
pop(s);
else
return false;
break;
}
}
if(Isempty(s))
return true;
return false;
}

int main()
{
Sqstack s;
InitStack(s);
if(Match(s))
printf("输入的括号匹配!\n");
else
printf("输入的括号不匹配!\n");
free(s.base);
return 0;
}
全部回答
#include"stdio.h" #define strackmaxsize 100 typedef struct{ char stack[strackmaxsize]; int top; }stack; void initstack(stack*s){ //初始化空栈 s->top=-1; } void push(stack*s,char ch){ (s->top)++;s->stack[s->top]=ch; } void pop(stack*s,char*p){ *p=s->stack[s->top];(s->top)--; } int stackempty(stack*s){ if(s->top==-1)return 1; else return 0; } void bracket(char*str){ stack s1,*s=&s1; char e; int i=0,flag1=0,flag2; initstack(s); while(str[i]!='\0'){ switch(str[i]){ case'(':push(s,'('); break; //进栈 case')':pop(s,&e); if(e!='(')flag1=1; break; default:break; } if(flag1)break; //出现不匹配,立即结束循环 i++; } flag2=stackempty(s); //flag2判断堆栈是否为空 if(!flag1 && flag2)printf("括号匹配!\n"); else printf("括号不匹配!\n"); } void main(){ char str[100]; printf("请输入表达式: "); gets(str); bracket(str); }
include "seqstack1.h" include "stdio.h" void BracketMatch(char str); void BracketMatch(char str)  { 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对应的左右括号不同类);   retur }/switch/}/for/ if(IsEmpty(&S))printf("\n括号匹配!"); elsprintf("\n左括号多余!");} void main(){ char str[100]; printf("please input:"); gets(str); BracketMatch(str);} 这是对所输入的字符串进行括号匹配,所有的括号都包括。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
支付宝网上银行付款怎么找不到中国邮政储蓄
I’m tired outI stayed up the whole night,
我未成年~用别人的身份证在KTV工作行吗~相
蔷薇水晶 粉水晶 海蓝宝 这三串水晶可不可以
我装了陆游器之后 为什么只能上QQ聊天 其他什
关于我国金融监管的发展,中国人民银行于1953
中国移动通信桃源营业厅地址在什么地方,想过
老公一夜不归怎么整治
中国移动和昌营业厅地址在哪,我要去那里办事
在等腰梯形ABCD中,AD‖BC,AB=CD,∠DBC=45°,
丁香花园对外开放吗
刮淋巴,疏通淋巴对身体有什么作用
阿修罗适合用钝器吗比如赤血鬼影虫
宇星驾校(报名处)地址在什么地方,想过去办事
看照片是不是手指皮肤角质化?
推荐资讯
五菱宏光v电动门窗可以自动升降不
0.2与0.20的意义相同吗?
有一种植物他们叫它大前子像菇娘似的谁知道它
【omg什么意思】OMG!啥意思
跟男朋友要照片,我是变态么
“电锤+风镐” 哪些品牌有这样的多功能电锤
500亩山种桉树要投资多少钱?多少年收益?收
我现在觉得自己身边没有人能够懂我,了解我!
青岛市市北区人民检察院举报中心地址在哪,我
莱布尼茨三角形的第十行从左边数第三个数是?
诚信购物广场这个地址在什么地方,我要处理点
大家知道科目三电子考好还是有考官好呢!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?