本专栏持续输出数据结构题目集,欢迎订阅。
题目
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:
1.从 S1 中弹出两个数字,顺序为 n1 和 n2;
2.从 S2 中弹出一个运算符 op;
3.执行计算 n2 op n1;
4.将得到的结果压回 S1。
直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。
输入格式:
1.输入首先在第一行给出正整数 N(1<N≤10^3),为 S1 中数字的个数。
2.第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。
输出格式:
1.将输入的数字和运算符按给定顺序分别压入堆栈 S1 和 S2,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10^9。
2.如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。
输入样例 1:
5
40 5 8 3 2
/ * - +
输出样例 1:
2
输入样例 2:
5
2 5 8 4 4
*
/ - +
输出样例 2:
ERROR: 5/0
题目引用自团体程序设计天梯赛真题(2020年)。
代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack {
int *data;
int top;
int capacity;
} Stack;
Stack* createStack(int capacity) {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->data = (int*)malloc(sizeof(int) * capacity);
stack->top = -1;
stack->capacity = capacity;
return stack;
}
int isEmpty(Stack* stack) {
return stack->top == -1;
}
void push(Stack* stack, int value) {
stack->data[++stack->top] = value;
}
int pop(Stack* stack) {
return stack->data[stack->top--];
}
int peek(Stack* stack) {
return stack->data[stack->top];
}
int main() {
int N;
scanf("%d", &N);
Stack* S1 = createStack(N);
Stack* S2 = createStack(N-1);
// 读取数字压入S1
for (int i = 0; i < N; i++) {
int num;
scanf("%d", &num);
push(S1, num);
}
// 读取运算符压入S2
for (int i = 0; i < N-1; i++) {
char op[2];
scanf("%s", op);
push(S2, op[0]);
}
// 执行计算
while (!isEmpty(S2)) {
int n1 = pop(S1);
int n2 = pop(S1);
char op = pop(S2);
int result;
if (op == '/' && n1 == 0) {
printf("ERROR: %d/0\n", n2);
free(S1->data);
free(S1);
free(S2->data);
free(S2);
return 0;
}
switch (op) {
case '+':
result = n2 + n1;
break;
case '-':
result = n2 - n1;
break;
case '*':
result = n2 * n1;
break;
case '/':
result = n2 / n1;
break;
}
push(S1, result);
}
printf("%d\n", pop(S1));
free(S1->data);
free(S1);
free(S2->data);
free(S2);
return 0;
}