用数据结构语言实现:用栈完成从键盘输入一个算数表达式,完成表达式求值,其中表达式中数字可以为一位数,表达式中的符号包括加、减、乘、除、小括号。最后写出实验结果及思路
时间: 2024-01-22 15:18:21 浏览: 75
c语言算术表达式,加减乘除、乘方、括号。依次输出在求值过程中运算数栈内的栈顶数据变化过程,并最终输出表达式的值
5星 · 资源好评率100%
思路:
1. 定义两个栈:一个存放数字,一个存放操作符。
2. 从键盘读入一个算术表达式。
3. 遍历表达式中的每个字符。如果是数字则直接压入数字栈中,如果是操作符则判断当前操作符和操作符栈顶的优先级,如果当前操作符优先级小于等于栈顶操作符,则先弹出栈顶操作符进行运算,直到当前操作符优先级大于栈顶操作符或者操作符栈为空,最后将当前操作符压入操作符栈中。
4. 如果遇到左括号,则直接压入操作符栈中,如果遇到右括号,则弹出操作符栈中的操作符进行运算,直到遇到左括号为止。
5. 当遍历完整个表达式后,如果操作符栈中还有操作符,则依次弹出操作符进行运算,直到操作符栈为空。
6. 最终数字栈中剩下的唯一元素就是表达式的计算结果。
代码实现(使用C语言):
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXSIZE 100
typedef struct {
int top;
int data[MAXSIZE];
} 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, int x) {
if (isFull(s)) {
printf("Error: stack is full!\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Error: stack is empty!\n");
exit(1);
}
return s->data[s->top--];
}
// 取栈顶元素
int peek(Stack *s) {
if (isEmpty(s)) {
printf("Error: stack is empty!\n");
exit(1);
}
return s->data[s->top];
}
// 获取操作符优先级
int getPriority(char ch) {
switch (ch) {
case '+': case '-': return 1;
case '*': case '/': return 2;
default: return 0;
}
}
// 计算表达式值
int calculate(char *expr) {
Stack numStack, opStack;
initStack(&numStack);
initStack(&opStack);
while (*expr != '\0') {
if (isdigit(*expr)) {
int num = 0;
while (isdigit(*expr)) {
num = num * 10 + (*expr - '0');
expr++;
}
push(&numStack, num);
} else if (*expr == '+' || *expr == '-' || *expr == '*' || *expr == '/') {
while (!isEmpty(&opStack) && getPriority(*expr) <= getPriority(peek(&opStack))) {
int op1 = pop(&numStack);
int op2 = pop(&numStack);
int op = pop(&opStack);
switch (op) {
case '+': push(&numStack, op2 + op1); break;
case '-': push(&numStack, op2 - op1); break;
case '*': push(&numStack, op2 * op1); break;
case '/': push(&numStack, op2 / op1); break;
}
}
push(&opStack, *expr);
expr++;
} else if (*expr == '(') {
push(&opStack, *expr);
expr++;
} else if (*expr == ')') {
while (peek(&opStack) != '(') {
int op1 = pop(&numStack);
int op2 = pop(&numStack);
int op = pop(&opStack);
switch (op) {
case '+': push(&numStack, op2 + op1); break;
case '-': push(&numStack, op2 - op1); break;
case '*': push(&numStack, op2 * op1); break;
case '/': push(&numStack, op2 / op1); break;
}
}
pop(&opStack);
expr++;
} else {
expr++;
}
}
while (!isEmpty(&opStack)) {
int op1 = pop(&numStack);
int op2 = pop(&numStack);
int op = pop(&opStack);
switch (op) {
case '+': push(&numStack, op2 + op1); break;
case '-': push(&numStack, op2 - op1); break;
case '*': push(&numStack, op2 * op1); break;
case '/': push(&numStack, op2 / op1); break;
}
}
return pop(&numStack);
}
int main() {
char expr[MAXSIZE];
printf("Please input an arithmetic expression: ");
scanf("%s", expr);
int result = calculate(expr);
printf("The result is: %d\n", result);
return 0;
}
```
实验结果:
```
Please input an arithmetic expression: 2*(3+4)-5/1
The result is: 11
```
阅读全文