数据结构中用C语言,利用栈的知识,进行表达式求值,要代码
时间: 2023-10-26 07:04:43 浏览: 104
C语言版数据结构,用栈实现表达式求值
下面是一个基于栈的表达式求值的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义栈结构体
typedef struct stack {
int top; // 栈顶指针
int* data; // 栈数据
} Stack;
// 初始化栈
Stack* initStack(int size) {
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
s->data = (int*)malloc(size * sizeof(int));
return s;
}
// 判断栈是否为空
int isEmpty(Stack* s) {
return s->top == -1;
}
// 入栈
void push(Stack* s, int val) {
s->top++;
s->data[s->top] = val;
}
// 出栈
int pop(Stack* s) {
int val = s->data[s->top];
s->top--;
return val;
}
// 获取栈顶元素
int peek(Stack* s) {
return s->data[s->top];
}
// 获取操作符优先级
int getPriority(char op) {
if (op == '*' || op == '/') {
return 2;
} else if (op == '+' || op == '-') {
return 1;
} else {
return 0;
}
}
// 计算表达式
int calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
// 表达式求值
int evaluate(char* expression) {
int len = strlen(expression);
Stack* numStack = initStack(len);
Stack* opStack = initStack(len);
for (int i = 0; i < len; i++) {
char ch = expression[i];
if (ch >= '0' && ch <= '9') {
int num = ch - '0';
while (i + 1 < len && expression[i + 1] >= '0' && expression[i + 1] <= '9') {
num = num * 10 + (expression[i + 1] - '0');
i++;
}
push(numStack, num);
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
while (!isEmpty(opStack) && getPriority(ch) <= getPriority(peek(opStack))) {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
push(numStack, calculate(a, b, op));
}
push(opStack, ch);
} else if (ch == '(') {
push(opStack, ch);
} else if (ch == ')') {
while (peek(opStack) != '(') {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
push(numStack, calculate(a, b, op));
}
pop(opStack);
}
}
while (!isEmpty(opStack)) {
int b = pop(numStack);
int a = pop(numStack);
char op = pop(opStack);
push(numStack, calculate(a, b, op));
}
int result = pop(numStack);
free(numStack->data);
free(numStack);
free(opStack->data);
free(opStack);
return result;
}
int main() {
char expression[100];
printf("请输入表达式:");
scanf("%s", expression);
printf("表达式的计算结果为:%d\n", evaluate(expression));
return 0;
}
```
这个代码使用两个栈,一个栈用来存储操作数,一个栈用来存储操作符。具体实现过程中,遇到数字则入操作数栈,遇到操作符则与操作符栈顶元素比较优先级,如果大于或等于则将该操作符入栈,否则将操作符栈顶元素出栈,与操作数栈顶的两个元素进行计算,将结果入操作数栈,直到当前操作符可以入栈。如果表达式扫描完毕,操作符栈中还有元素,则依次取出操作符和操作数进行计算,直到操作符栈为空。最终操作数栈中只有一个元素,即为表达式的计算结果。
阅读全文