怎么修改
#include<stdio.h>#include<stdlib.h>
#define MaxSize 50
typedef struct //存放数字
{
char data;
int top;
}opnds;
typedef struct //存放运算符
{
char data;
int top;
}optrs;
void Init_Stack(optrs *&S)//初始化栈
{
S = (optrs *)malloc(sizeof(optrs));
S->top = 0;
}
bool Push(optrs *&S,char e)//入栈
{
if(S->top == MaxSize)
return false;
S->data = e;
S->top ++;
return true;
}
bool Pop(optrs *&S)//出栈
{
char e;
if(S->top == 0)
return false;
S->top --;
e = S->data;
return true;
}
bool GetTop(optrs *&S,char &e)//取栈顶元素
{
if(S->top == 0)
return false;
e = S->data;
return true;
}
bool Match(char *p) //判断括号是否匹配
{
int i,j = 0,d;
optrs *S;
if(p == '\0')
{
return true;
}
Init_Stack(S);
for(i = 0;p != '\0';i ++)//遍历字符串
{
j = i;
while(p >= '0' && p <= '9')
{
d = d*10 + p - '0';
j ++;
}
if(d != 0)
{
opnds.data = d;
opnds.top ++;
}
i = j;
if(('(' == p||')' == p)||('[' == p||']' == p)||('{' == p||'}' == p))
{
if('(' == p||'[' == p||'{' == p)
{
Push(S,p);
}
else
{
char top;
GetTop(S,top);
if('(' == top && ')' == p||'[' == top && ']' == p||'{' == top && '}' == p)
{
Pop(S);
}
}
}
if(S->top != 0)
return false;
else
return true;
}
}
int main()
{
char p;
int i;
printf("请输入算术运算表达式:\n");
for(i=0;i++;i<20)
{
scanf("%c",p);
}
if(Match(p))
printf("匹配成功!\n");
else
printf("匹配失败!\n");
} 这段代码有一些问题:
1. 没有包含所需的头文件。
2. 定义了两个相同的结构体opnds和optrs,可以只定义一个结构体用于存放栈。
3. Push函数和Pop函数中没有正确地处理栈顶元素的赋值。
下面是修正后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 50
typedef struct
{
char data;
int top;
} Stack;
void Init_Stack(Stack *&S)
{
S = (Stack *)malloc(sizeof(Stack));
S->top = -1;
}
bool Push(Stack *&S, char e)
{
if(S->top == MaxSize - 1)
return false;
S->top++;
S->data = e;
return true;
}
bool Pop(Stack *&S, char &e)
{
if(S->top == -1)
return false;
e = S->data;
S->top --;
return true;
}
bool GetTop(Stack *&S, char &e)
{
if(S->top == -1)
return false;
e = S->data;
return true;
}
bool Match(char *p)
{
int i;
Stack *S;
char topChar;
Init_Stack(S);
for(i = 0; p != '\0'; i++)
{
if(p == '(')
{
Push(S, p); // 将左括号入栈
}
else if(p == ')')
{
if(!Pop(S, topChar)) // 如果栈空,说明右括号没有匹配的左括号
return false;
}
}
if(S->top != -1)
return false;
else
return true;
}
int main()
{
char p;
int i;
printf("请输入算术运算表达式:\n");
gets(p);
if(Match(p))
printf("括号匹配成功!\n");
else
printf("括号匹配失败!\n");
return 0;
}
这段代码实现了检查一个表达式中的括号是否匹配。根据输入的表达式,使用堆栈来检查左右括号的匹配情况。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]