假设一个算术表达式中包含三种括号:圆括号“(”和“)”,方括号“[”和“]”以及花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用,如(.. .[.. .{.. .}.. .[.. .].. .].. .( .. .[.. .].. .)。试利用栈的运算编写判断给定表达式中所含括号是否正确配对出现的算法。 其中exp为字符串类型的变量。如果括号正确配对,则输出“ ”并返回1;否则输出“Mismatch”和栈中元素,并返回0。 用C语言编写程序实现上述功能
时间: 2023-06-15 17:07:13 浏览: 322
设计一个算法判别一个算术表达式的圆括号是否正确配对
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
char data[MAXSIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isStackEmpty(Stack s) {
if (s.top == -1)
return 1;
else
return 0;
}
int isStackFull(Stack s) {
if (s.top == MAXSIZE - 1)
return 1;
else
return 0;
}
void push(Stack *s, char c) {
if (isStackFull(*s)) {
printf("Stack Overflow\n");
exit(1);
}
s->top++;
s->data[s->top] = c;
}
char pop(Stack *s) {
if (isStackEmpty(*s)) {
printf("Stack Underflow\n");
exit(1);
}
char c = s->data[s->top];
s->top--;
return c;
}
int isMatch(char a, char b) {
if (a == '(' && b == ')')
return 1;
if (a == '[' && b == ']')
return 1;
if (a == '{' && b == '}')
return 1;
return 0;
}
int isValidExp(char *exp) {
Stack s;
initStack(&s);
int len = strlen(exp);
for (int i = 0; i < len; i++) {
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') {
push(&s, exp[i]);
} else if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}') {
if (isStackEmpty(s) || !isMatch(pop(&s), exp[i])) {
printf("Mismatch: ");
while (!isStackEmpty(s)) {
printf("%c", pop(&s));
}
printf("\n");
return 0;
}
}
}
if (isStackEmpty(s))
return 1;
else {
printf("Mismatch: ");
while (!isStackEmpty(s)) {
printf("%c", pop(&s));
}
printf("\n");
return 0;
}
}
int main() {
char exp[MAXSIZE];
printf("Enter the expression: ");
scanf("%s", exp);
if (isValidExp(exp))
printf("The expression is valid\n");
return 0;
}
```
运行结果示例:
```
Enter the expression: (.. .[.. .{.. .}.. .[.. .].. .].. .( .. .[.. .].. .)
Mismatch: (
```
说明:输入的表达式中包含了未正确配对的左括号“(”。
阅读全文