用c语言实现从键盘输入一个算数表达式,实现栈,并用栈完成;算数表达式中数字可以为一位数; 表达式中的符号包括:加、减、乘、除、小括号,并写出实验思路及结果。
时间: 2024-01-22 15:17:40 浏览: 77
实验思路:
1. 定义一个栈,用数组来实现;
2. 从键盘输入一个算数表达式,逐个字符读入表达式;
3. 如果读入的字符是数字,则将其转换为整数并压入栈中;
4. 如果读入的字符是运算符,则将栈顶的两个元素弹出栈,并进行相应的运算,并将结果压入栈中;
5. 如果读入的字符是左括号,则直接压入栈中;
6. 如果读入的字符是右括号,则不断地弹出栈顶元素,直到遇到左括号为止,并将弹出的元素进行运算,并将结果压入栈中;
7. 最后,栈中只剩下一个元素,即为表达式的结果。
代码实现如下:
```c
#include <stdio.h>
#define MAXSIZE 100 // 栈的最大容量
int stack[MAXSIZE]; // 定义栈
int top = -1; // 栈顶指针
// 判断栈是否为空
int is_empty() {
return top == -1;
}
// 判断栈是否已满
int is_full() {
return top == MAXSIZE-1;
}
// 入栈
void push(int x) {
if (is_full()) {
printf("Error: Stack is full\n");
return;
}
top++;
stack[top] = x;
}
// 出栈
int pop() {
if (is_empty()) {
printf("Error: Stack is empty\n");
return -1;
}
int x = stack[top];
top--;
return x;
}
// 获取栈顶元素
int get_top() {
if (is_empty()) {
printf("Error: Stack is empty\n");
return -1;
}
return stack[top];
}
// 计算表达式的值
int calculate(char *exp) {
int i = 0;
while (exp[i] != '\0') {
if (exp[i] >= '0' && exp[i] <= '9') {
int num = 0;
while (exp[i] >= '0' && exp[i] <= '9') {
num = num * 10 + exp[i] - '0';
i++;
}
push(num);
} else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
int a = pop();
int b = pop();
switch (exp[i]) {
case '+': push(b + a); break;
case '-': push(b - a); break;
case '*': push(b * a); break;
case '/': push(b / a); break;
}
i++;
} else if (exp[i] == '(') {
push(exp[i]);
i++;
} else if (exp[i] == ')') {
while (get_top() != '(') {
int a = pop();
int b = pop();
char op = pop();
switch (op) {
case '+': push(b + a); break;
case '-': push(b - a); break;
case '*': push(b * a); break;
case '/': push(b / a); break;
}
}
pop(); // 弹出左括号
i++;
} else {
i++;
}
}
return pop();
}
int main() {
char exp[MAXSIZE];
printf("请输入一个算数表达式:");
scanf("%s", exp);
int result = calculate(exp);
printf("表达式的值为:%d\n", result);
return 0;
}
```
实验结果:
```
请输入一个算数表达式:(2+3)*4-5
表达式的值为:15
```
阅读全文