用c语言把中缀表达式转为后缀表达式
时间: 2023-11-13 11:27:13 浏览: 69
好的,您可以使用栈来实现中缀表达式转后缀表达式。
1. 从左到右扫描中缀表达式的每一个元素。
2. 若遇到操作数,则直接输出。
3. 若遇到运算符,则判断栈顶元素的优先级,若栈顶元素的优先级大于等于当前运算符,则弹出栈顶元素并输出,直到栈顶元素的优先级小于当前运算符或栈为空,将当前运算符入栈。
4. 若遇到左括号,则入栈。
5. 若遇到右括号,则弹出栈顶元素并输出,直到遇到左括号,并将左括号弹出丢弃。
6. 扫描完毕后,若栈不为空,则全部弹出并输出。
以下是用c语言实现中缀表达式转后缀表达式的代码,仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LENGTH 100 //设定表达式的最大长度
//定义栈结构
struct Stack {
char data[MAX_LENGTH];
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_LENGTH - 1;
}
//入栈
void Push(struct Stack *s, char element) {
if (IsFull(s)) {
printf("Stack is full!\n");
exit(0);
} else {
s->top++;
s->data[s->top] = element;
}
}
//出栈
char Pop(struct Stack *s) {
if (IsEmpty(s)) {
printf("Stack is empty!\n");
exit(0);
} else {
char element = s->data[s->top];
s->top--;
return element;
}
}
//返回栈顶元素
char Top(struct Stack *s) {
if (IsEmpty(s)) {
printf("Stack is empty!\n");
exit(0);
} else {
return s->data[s->top];
}
}
//获取运算符的优先级
int GetPriority(char op) {
if (op == '*' || op == '/')
return 2;
else if (op == '+' || op == '-')
return 1;
else
return 0;
}
//将中缀表达式转换为后缀表达式
void InfixToPostfix(char *infix, char *postfix) {
struct Stack s; //定义栈
InitStack(&s); //初始化栈
int i, j;
for (i = 0, j = 0; i < strlen(infix); i++) {
char ch = infix[i];
//若遇到操作数,则直接输出到后缀表达式中
if (ch >= '0' && ch <= '9') {
postfix[j++] = ch;
} else if (ch == '(') { //若遇到左括号,则入栈
Push(&s, ch);
} else if (ch == ')') { //若遇到右括号,则弹出栈顶元素并输出,直到遇到左括号,并将左括号弹出丢弃
while (Top(&s) != '(') {
postfix[j++] = Pop(&s);
}
Pop(&s);
} else { //若遇到运算符,则判断栈顶元素的优先级,若栈顶元素的优先级大于等于当前运算符,则弹出栈顶元素并输出,直到栈顶元素的优先级小于当前运算符或栈为空,将当前运算符入栈
while (!IsEmpty(&s) && GetPriority(Top(&s)) >= GetPriority(ch)){
postfix[j++] = Pop(&s);
}
Push(&s, ch);
}
}
while (!IsEmpty(&s)) { //扫描完毕后,若栈不为空,则全部弹出并输出
postfix[j++] = Pop(&s);
}
postfix[j] = '\0'; //将后缀表达式字符串结尾
}
//主函数
int main() {
char infix[MAX_LENGTH];
char postfix[MAX_LENGTH];
printf("Please input the infix expression: ");
fgets(infix, MAX_LENGTH, stdin);
infix[strlen(infix) - 1] = '\0'; //去掉输入的换行符
InfixToPostfix(infix, postfix);
printf("The postfix expression: %s", postfix);
return 0;
}
阅读全文