#include<stdlib.h>
#include<string.h>
#include<stdio.h>
int match(char *str)
{
char stackMemroy[1024];
int top = -1;
int i = 0;
while (str[i] != '\0')
{
if (str[i] == ')')//出
{
if (top > -1)
{
top--;
}
else
{
return -1;
}
}
else if (str[i] == '(')//入
{
stackMemroy[++top] = str[i];
}
i++;
}
if (top == -1)
return 0;
else
return 1;
}
int main()
{
while(1)
{
char str[1024] = "";
gets_s(str, 1024);
/*scanf_s("%d", str);*/
int result = match(str);
if (result == 0)
{
printf("匹配\n");
}
else if (result == 1)
{
printf("多了左边括号\n");
}
else
{
printf("多了右边括号\n");
}
}
return 0;
}
在四则算术运算表达式中,可以包含圆括号和方括号,而且还允许它们嵌套出现。试编写一个算法实现括号匹配。我的问题是 输入数据到数组后,不能进行匹配,不知道错在哪 求指导!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 赵4老师 2022-03-29 13:58关注
仅供参考:
#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/ ELEMTYPE * base; ELEMTYPE * top; int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/ s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE))); if (!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/ if (s->top==s->base) return OK; else return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/ if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/ s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE))); if (!s->base) return ERROR; s->stacksize+=STACK_GROW_SIZE; s->top=s->base+s->stacksize; } *s->top++=e; return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/ if (StackEmpty(s)) return ERROR; *e=*(--s->top); return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) { if ((a=='('&&b!=')') ||(a=='['&&b!=']') ||(a=='{'&&b!='}')) { return ERROR; } else return OK; } int Count(SpStack *s) { ELEMTYPE e[STACK_INIT_SIZE*2]; ELEMTYPE e1; int i; InitStack(s); fgets(e,STACK_INIT_SIZE*2,stdin); if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0; printf("%s\n",e); for (i=0;e[i]!='\0';i++) { switch (e[i]) { case '(': case '[': case '{': Push(s,e[i]); break; case ')': case ']': case '}': if (StackEmpty(s)) { printf("%*s↖右括号多余\n",i+1,""); return(ERROR); } else Pop(s,&e1); if (!Comp(e1,e[i])) { printf("%*s↖左右匹配出错\n",i+1,""); return(ERROR); } } } if (!StackEmpty(s)) { printf("%*s↖左括号多余\n",i,""); return(ERROR); } else { printf("匹配正确\n"); return(OK); } } void main() { SpStack s; Count(&s); free(s.base); }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥100 微信小程序跑脚本授权的问题
- ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
- ¥15 STM32串口接收问题
- ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
- ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
- ¥15 MATLAB和mosek的求解问题
- ¥20 修改中兴光猫sn的时候提示失败
- ¥15 java大作业爬取网页
- ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?
- ¥15 有没有办法利用libusb读取usb设备数据