用c 语言实现利用栈检查括号匹配问题 假设一个算术表达式中包含三种括号:圆括号“(”和“)”,方括号“[”和“]”以及花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用,如(.. .[.. .{.. .}.. .[.. .].. .].. .( .. .[.. .].. .)。试利用栈的运算编写判断给定表达式中所含括号是否正确配对出现的算法。 对表达式进行扫描,凡遇到“(”、“[”或“{”就入栈,当遇到“)”、“]”或“}”时,检查当前栈顶元素是否是对应的左括号,若是就退掉栈顶的“(”、“[”或“{”,否则不配对。如果表达式中括号匹配,表达式扫描完毕,栈应为空。 编写Compare(char a, char b)算法,用于判断左括号”(“与右括号”)”是否匹配(”[”与”]”,”{“与”}”)。 编写检查是否配对的算法int correct(char exp[]);其中exp为字符串类型的变量。如果括号正确配对,则输出“ ”并返回1;否则输出“Mismatch”和栈中元素,并返回0。(此算法的实现需要调用Compare算法) 分别以 a*(c-b)-{(b-d)*[(a+b)*(a-b)-(c-d)/2]} a*(c-b)-{(b-d(*[(a+b)*(a-b)-(c-d)/2])} a*(c-b)-]{(b-d(*[(a+b)*(a-b)-(c-d)/2])} 作为测试用例测试程序的正确性。用C语言实现这个程序
时间: 2023-06-15 16:06:48 浏览: 113
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
// 定义一个栈结构体
struct Stack {
char data[MAX_SIZE];
int top;
};
// 初始化栈
void initStack(struct Stack* s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(struct Stack* s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(struct Stack* s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(struct Stack* s, char c) {
if (isFull(s)) {
printf("Stack Overflow\n");
return;
}
s->top++;
s->data[s->top] = c;
}
// 出栈
char pop(struct Stack* s) {
if (isEmpty(s)) {
printf("Stack Underflow\n");
return '\0';
}
char c = s->data[s->top];
s->top--;
return c;
}
// 判断左右括号是否匹配
int Compare(char a, char b) {
if ((a == '(' && b == ')') || (a == '[' && b == ']') || (a == '{' && b == '}')) {
return 1;
}
return 0;
}
// 检查括号是否配对
int correct(char exp[]) {
struct 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] == '}') {
char c = pop(&s);
if (!Compare(c, exp[i])) {
printf("Mismatch: %c\n", c);
return 0;
}
}
}
if (!isEmpty(&s)) {
printf("Mismatch: %c\n", pop(&s));
return 0;
}
printf("Correct\n");
return 1;
}
int main() {
char exp1[] = "a*(c-b)-{(b-d)*[(a b)*(a-b)-(c-d)/2]}";
char exp2[] = "a*(c-b)-{(b-d(*[(a b)*(a-b)-(c-d)/2])}";
char exp3[] = "a*(c-b)-]{(b-d(*[(a b)*(a-b)-(c-d)/2])}";
correct(exp1);
correct(exp2);
correct(exp3);
return 0;
}
阅读全文