用c语言栈实现,一次性将所有的运算命令输入。首行输入一个数字,表示运算命令的总个数,其余每行表示一个运算命令:包括运算操作符和操作数。运算操作符有只有Add、Sub、Mul,即加法、减法、乘法三种。计算表达式为(5-4)*4-2+1。并给出详细注释
时间: 2024-05-09 17:20:56 浏览: 138
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义栈的最大容量
typedef struct {
int data[MAXSIZE]; // 存储栈中元素的数组
int top; // 栈顶指针
} 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("Stack is full.\n");
exit(1);
}
s->data[++s->top] = x;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty.\n");
exit(1);
}
return s->data[s->top--];
}
int main() {
int n, i, a, b, c;
char op;
scanf("%d", &n); // 输入命令总个数
Stack s;
initStack(&s); // 初始化栈
for (i = 0; i < n; i++) {
scanf("%c", &op); // 读入操作符
if (op == ' ') { // 如果是空格,继续读入下一个字符
scanf("%c", &op);
}
if (op == 'A') { // 如果是加法
scanf("%d", &a); // 读入操作数
push(&s, a); // 将操作数入栈
} else if (op == 'S') { // 如果是减法
scanf("%d", &a);
b = pop(&s); // 将栈顶元素出栈,并保存到b中
push(&s, b - a); // 将b-a的结果入栈
} else if (op == 'M') { // 如果是乘法
scanf("%d", &a);
b = pop(&s);
push(&s, b * a); // 将b*a的结果入栈
}
}
c = pop(&s); // 取出栈顶元素,即为最终结果
printf("%d\n", c); // 输出结果
return 0;
}
```
解释:
首先定义了一个结构体 `Stack`,用于存储栈的元素和栈顶指针。其中 `MAXSIZE` 定义了栈的最大容量。
然后定义了几个栈的操作函数:`initStack()` 用于初始化栈,`isEmpty()` 用于判断栈是否为空,`isFull()` 用于判断栈是否已满,`push()` 用于将元素入栈,`pop()` 用于将栈顶元素出栈。
在主函数中,首先读入命令总个数 `n`,然后初始化栈。接着使用循环,对于每个命令,读入操作符 `op`,如果 `op` 是空格,则读入下一个字符。如果 `op` 是加法,就读入操作数 `a`,并将其入栈;如果 `op` 是减法,就将栈顶元素出栈,用 `b` 保存,并将 `b-a` 的结果入栈;如果 `op` 是乘法,就将栈顶元素出栈,用 `b` 保存,并将 `b*a` 的结果入栈。最后,取出栈顶元素,即为最终结果,输出即可。
阅读全文