мой код относительно прост в том, для чего он предназначен, он принимает аргументы командной строки и соответствующим образом размещает стек.
аргумент командной строки: «2 2 +» должен равняться 4.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct stack {
int top;
int items[100];
} stack;
void initializeStack(stack* p);
void push(stack* p, int val);
int pop(stack* p);
int main(int argc, char** argv) {
int i, a, b;
int val = 0;
stack ph;
initializeStack(&ph);
for(i=1; i<argc; i++) {
if(strcmp(argv[i], "*") == 0) {
a = pop(&ph);
b = pop(&ph);
val = a*b;
push(&ph, val);
}
else if(strcmp(argv[i], "/") == 0) {
a = pop(&ph);
b = pop(&ph);
val = b/a;
push(&ph, val);
}
else if(strcmp(argv[i], "+") == 0) {
a = pop(&ph);
b = pop(&ph);
val = a+b;
push(&ph, val);
}
else if(strcmp(argv[i], "-") == 0) {
a = pop(&ph);
b = pop(&ph);
val = b-a;
push(&ph, val);
}
else if(strcmp(argv[i], "^") == 0) {
a = pop(&ph);
b = pop(&ph);
val = pow(a,b);
push(&ph, val);
}
else if(strcmp(argv[i], "%") == 0) {
a = pop(&ph);
b = pop(&ph);
val = b%a;
push(&ph, val);
}
else {
push(&ph, atoi(argv[i]));
}
}
printf("%d\n", pop(&ph));
return 0;
}
void initializeStack(stack* p) {
p->top = 0;
}
void push(stack* p, int val) {
p->top++;
p->items[p->top] = val;
}
int pop(stack* p) {
int y;
y = p->items[p->top];
p->items[p->top] = 0;
(p->top)--;
return y;
}
Я пробовал «2 2 +», и это сработало, как и «2 4 + 3 / 6 +», оно оценивается как 8. но есть проблема, где «2 4 ^ 2 * 5 % 2 - ", где он должен оцениваться как 0, но вместо этого я получаю -2. при чем тут недоработка?
items[0]
, поскольку вы увеличиваетеtop
перед сохранением, что странно. Не уверен, что это ошибка, но это страшно, так как вы рискуете переполниться. - person unwind   schedule 01.07.2014