ડꫀꫀ ꪗꪮꪊ. 2022-03-29 13:29 采纳率: 88.6%

# 在四则算术运算表达式中，可以包含圆括号和方括号，而且还允许它们嵌套出现。试编写一个算法实现括号匹配。我的问题是 输入数据到数组后，不能进行匹配，不知道错在哪 求指导！

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

• 写回答

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

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

• 系统已结题 4月15日
• 已采纳回答 4月7日
• 修改了问题 3月29日
• 创建了问题 3月29日

#### 悬赏问题

• ¥15 w10部分软件不能联网
• ¥15 关于安装hbase的问题(操作系统-windows)