写一段代码,用c++的栈和逆波兰算法实现表达式求解,并实现。
时间: 2023-06-06 20:07:41 浏览: 121
为了保证算法的正确性,我们首先要将中缀表达式转化成后缀表达式,也就是逆波兰表达式。实现逆波兰表达式的常用方法是使用栈来实现。
下面是代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_EXPR_LEN 100 // 表达式最大长度
#define MAX_STACK_SIZE 50 // 栈最大长度
// 栈结构体
typedef struct Stack {
int top;
int data[MAX_STACK_SIZE];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 入栈
void push(Stack *s, int data) {
s->top++;
s->data[s->top] = data;
}
// 出栈
int pop(Stack *s) {
int data = s->data[s->top];
s->top--;
return data;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return (s->top == -1);
}
// 逆波兰表达式求解
int evaluate(char *expr) {
Stack s;
init(&s);
int i, len = strlen(expr);
int op1, op2;
for (i = 0; i < len; i++) {
if (isdigit(expr[i])) {
push(&s, expr[i] - '0');
} else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
op2 = pop(&s);
op1 = pop(&s);
switch (expr[i]) {
case '+': push(&s, op1 + op2); break;
case '-': push(&s, op1 - op2); break;
case '*': push(&s, op1 * op2); break;
case '/': push(&s, op1 / op2); break;
default: break;
}
}
}
return pop(&s);
}
int main() {
char expr[MAX_EXPR_LEN];
printf("请输入表达式:");
scanf("%s", expr);
printf("结果为:%d\n", evaluate(expr));
return 0;
}
```
使用方法:
1. 编译代码:`gcc filename.c -o filename`,filename 为你给代码起的名字
2. 运行代码:`./filename`,根据提示输入表达式
3. 程序将输出表达式的计算结果
注意:
1. 表达式长度不得超过100
2. 表达式中只能包含数字,加减乘除四种运算符
3. 表达式必须符合逆波兰表达式的格式要求
以上就是用 c 的栈和逆波兰算法实现表达式求解的代码实现。
阅读全文