括孤匹配问题:编写程序,从标准输入得到的一个缺失左括号的表达式,输出补全括号之后的中序表达式。例如:输入1+2)*3-4)*5-6)));则程序应该输出((1+2)*(3-4)*(5-6)))要求:采用栈和队列来实现,用C语言
时间: 2024-10-19 14:05:15 浏览: 35
表达式括号匹配配对判断问题
4星 · 用户满意度95%
括号匹配问题是计算机科学中经典的动态规划问题,它涉及到栈和队列的数据结构。在C语言中,你可以使用栈来解决这个问题,因为栈的特性符合括号的嵌套规则:先入后出。下面是一个简单的C语言程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义字符类型的栈
typedef struct {
char* top;
int capacity;
} Stack;
void push(Stack* s, char c) {
if (s->top == NULL || s->capacity == s->top - s->base) {
s->capacity *= 2;
s->top = realloc(s->base, s->capacity * sizeof(char));
}
*s->top++ = c;
}
char pop(Stack* s) {
return s->top > s->base ? *--s->top : '\0';
}
int isMatching(char open, char close) {
return open == '(' && close == ')' || open == '{' && close == '}' || open == '[' && close == ']';
}
Stack* createStack(int size) {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = s->base = (char*)malloc(size);
s->capacity = size;
return s;
}
char* completeParentheses(char* input, Stack* stack) {
int i = 0;
for (; input[i] != '\0'; ++i) {
if (input[i] == '(' || input[i] == '{' || input[i] == '[') {
push(stack, input[i]);
} else if (input[i] == ')') {
if (stack->top && !isMatching(input[stack->top - 1], '(')) {
return NULL; // 栈顶元素不是左括号,无法匹配
} else {
pop(stack);
}
} else if (input[i] == '}') {
if (stack->top && !isMatching(input[stack->top - 1], '{')) {
return NULL;
} else {
pop(stack);
}
} else if (input[i] == ']') {
if (stack->top && !isMatching(input[stack->top - 1], '[')) {
return NULL;
} else {
pop(stack);
}
}
}
if (stack->top > 0) {
return NULL; // 未找到匹配结束括号,表达式不完整
} else {
char* result = (char*)malloc(strlen(input) + 1);
strncpy(result, input, strlen(input));
result[strlen(input)] = '\0';
return result;
}
}
int main() {
Stack* stack = createStack(10);
char input[] = "1+2)*3-4)*5-6)))";
char* result = completeParentheses(input, stack);
if (result != NULL) {
printf("Completetd expression: %s\n", result);
free(result);
} else {
printf("Invalid expression.\n");
}
free(stack->base);
free(stack);
return 0;
}
```
这个程序首先创建一个栈,然后遍历输入字符串,如果遇到左括号就压入栈中,如果遇到右括号,检查是否可以匹配栈顶的左括号。如果匹配成功,则弹出栈顶元素,如果不匹配或者到达了字符串末尾还没找到匹配,表示表达式不合法。
当遍历完输入字符串后,如果栈为空,说明已经完成了所有匹配,返回完整的表达式;否则返回NULL表示表达式不完整。
阅读全文