中缀式转后缀式C语言代码, 能够分析括号是否匹配,给出错误定位
时间: 2023-12-06 14:02:20 浏览: 67
好的,以下是中缀式转后缀式的C语言代码,同时也包括了括号匹配的判断和错误定位功能:
```c
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
char data[MAXSIZE];
int top;
} Stack;
void initStack(Stack* s) {
s->top = -1;
}
int isEmpty(Stack* s) {
return s->top == -1;
}
int isFull(Stack* s) {
return s->top == MAXSIZE - 1;
}
void push(Stack* s, char c) {
if (isFull(s)) {
printf("Error: Stack Overflow!\n");
return;
}
s->data[++(s->top)] = c;
}
char pop(Stack* s) {
if (isEmpty(s)) {
printf("Error: Stack Underflow!\n");
return '\0';
}
return s->data[(s->top)--];
}
char peek(Stack* s) {
if (isEmpty(s)) {
printf("Error: Stack Underflow!\n");
return '\0';
}
return s->data[s->top];
}
int isOperand(char c) {
return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
int getPriority(char c) {
if (c == '*' || c == '/') return 2;
if (c == '+' || c == '-') return 1;
return 0;
}
void infixToPostfix(char* infix, char* postfix) {
Stack s;
initStack(&s);
int i = 0, j = 0, len = strlen(infix), error = 0, errorPos = -1;
for (i = 0; i < len; i++) {
if (isOperand(infix[i])) {
postfix[j++] = infix[i];
} else if (infix[i] == '(') {
push(&s, '(');
} else if (infix[i] == ')') {
while (!isEmpty(&s) && peek(&s) != '(') {
postfix[j++] = pop(&s);
}
if (isEmpty(&s)) {
error = 1;
errorPos = i;
break;
}
pop(&s);
} else {
while (!isEmpty(&s) && peek(&s) != '(' && getPriority(peek(&s)) >= getPriority(infix[i])) {
postfix[j++] = pop(&s);
}
push(&s, infix[i]);
}
}
while (!isEmpty(&s)) {
if (peek(&s) == '(') {
error = 1;
errorPos = len - 1;
break;
}
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
if (error) {
printf("Error: Mismatched Parenthesis at position %d!\n", errorPos);
postfix[0] = '\0';
}
}
int main() {
char infix[MAXSIZE];
char postfix[MAXSIZE];
printf("Enter an infix expression: ");
fgets(infix, MAXSIZE, stdin);
infixToPostfix(infix, postfix);
printf("The postfix expression is: %s\n", postfix);
return 0;
}
```
代码中使用了一个栈来辅助转换,判断括号是否匹配以及定位错误的方法是:在遍历过程中记录当前位置,当遇到右括号时,如果栈为空则括号不匹配,此时记录错误位置为当前位置;在遍历结束后,如果栈中还有左括号未匹配,则同样记录错误位置为输入字符串的最后一个字符位置。如果出现错误,则输出错误信息并将转换结果置为空字符串。
需要注意的是,此代码中的输入字符串必须使用 fgets() 函数读入,而不能使用 scanf() 或 gets(),因为后两者无法读取含有空格的字符串。
阅读全文