从《The.C.Programming.Language.2Nd.Ed 》5.10题出发。发现输入波兰式计算的时候,遇到乘法运算符时,argv会与实际输入的参数不同。
Exercise 5-10. Write the program expr, which evaluates a reverse Polish expression from the command line, where each operator or operand is a separate argument. For example, expr 2 3 4 + * evaluates 2 * (3+4).
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
int stack[MAX_STACK_SIZE];
int top = -1;
void push(int value) {
if (top == MAX_STACK_SIZE - 1) {
printf("Stack overflow\n");
exit(EXIT_FAILURE);
}
stack[++top] = value;
}
int pop() {
if (top == -1) {
printf("Stack underflow\n");
exit(EXIT_FAILURE);
}
return stack[top--];
}
int evaluate(char *expression[]) {
for (int i = 0; expression[i] != NULL; i++) {
if (isdigit(*expression[i])) {
push(atoi(expression[i]));
} else if (expression[i][0] == '+' || expression[i][0] == '-' || expression[i][0] == '*' || expression[i][0] == '/') {
int operand2 = pop();
int operand1 = pop();
switch (expression[i][0]) {
case '+':
push(operand1 + operand2);
break;
case '-':
push(operand1 - operand2);
break;
case '*':
push(operand1 * operand2);
break;
case '/':
push(operand1 / operand2);
break;
default:
printf("Invalid operator: %s\n", expression[i]);
exit(EXIT_FAILURE);
}
} else {
printf("Invalid input: %s\n", expression[i]);
exit(EXIT_FAILURE);
}
}
return pop();
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <expression>\n", argv[0]);
return EXIT_FAILURE;
}
printf("Result: %d\n", evaluate(argv + 1));
return EXIT_SUCCESS;
}