2015-05-08 3 views
-1

Я уже пробовал использовать atoi, а затем переключил их обратно на строки, чтобы нажать, я пытаюсь сделать калькулятор rpn для класса, так что структура push, pop, seek и stack - это то, как тогда должно быть, но я не могу получить его добавьте целочисленные значения.Как добавить значения, поскольку они являются строками?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

struct stack 
{ 
    const char * data; 
    struct stack *bottom; 
}; 

struct stack * push(struct stack *stk,const char * x) 
{ 
    struct stack *nstk = (struct stack *)malloc(sizeof(struct stack)); 

    nstk->data = x; 
    nstk->bottom = stk; 

    return nstk; 
} 


const char * peek(struct stack *stk) 
{ 
    if(stk -> data) 
     return stk->data; 
    else 
     return("Stack is empty"); 
} 

struct stack *pop(struct stack *stk) 
{ 
    struct stack *tmp; 

    tmp = stk->bottom; 
    stk->bottom = NULL; 
    free(stk); 

    return tmp; 
} 

FILE * input_from_args(int argc,const char *argv[]) 
{ 
    if(strcmp(argv[1],"-e") != 0 && strcmp(argv[1],"-c") != 0 && strcmp(argv[1],"-g") != 0) 
    { 
     printf("Option %s is not supported \n", argv[1]); 
     exit(0); 
    } 

    else 
    { 
     return stdin; 
    } 
} 
void evaluate(struct stack * equation) 
{ 
    int op; 
    int op2; 
    int ans; 

    if(strcmp("A",equation->data) == 0) 
     { 
     op = (int)pop(equation)-> data; 
     op2 = (int)pop(equation)-> data; 
     ans = op + op2; 
     printf("%i",ans); 
     } 
} 

void convert(struct stack * equation) 
{ 
} 

void other (struct stack * equation) 
{ 

} 


int main(int argc,const char *argv[]) 
{ 
    FILE *src = input_from_args(argc, argv); 

    if (src == NULL) 
    { 
     printf("%s", "Invalid Source"); 
     exit(EXIT_FAILURE); 
    } 

    struct stack * equation = NULL; 

    int i; 
    for(i=2; i <= argc; i++) 
    { 
     equation = push(equation,argv[i]); 
    } 

    if(strcmp(argv[1],"-e") == 0) 
    { 
     evaluate(equation); 
    } 
    else if(strcmp(argv[1],"-c") == 0) 
    { 
     convert(equation); 
    } 
    else if(strcmp(argv[1],"-g") == 0) 
    { 
     other(equation); 
    } 

    return EXIT_SUCCESS; 
} 

, что все, что я до сих пор, если вы заметили какие-либо другие проблемы, которые прекрасно, но то, что я действительно хочу знать, как оценить уравнение постфикса с этой структурой данных, пример ввода будет -e 2 2 A 5 X.

+0

Почему вы настаиваете на сохранении ваших данных в виде строк? Если это связано с тем, что вы должны иметь возможность хранить оператор в том же стеке, добавьте для него элемент struct. – usr2564301

+0

Я уже пробовал это, это для класса, если я не оставляю push, pop, peek и struct так, как они есть, или я получу окраску, как я упоминал в оригинальной записи. – user4872257

+1

Тогда вы * do * должны использовать 'atoi' и' itoa'. Вы упомянули, что вы пробовали это, но потерпели неудачу - ну, это уродливо, но это должно сработать. Как бы то ни было, ваш текущий код выходит из строя, потому что вы пытаетесь добавить строки. * Кастинг * строка для int - это совсем неправильная идея. – usr2564301

ответ

1

Надеюсь, это будет полезно.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

typedef int DataType; 

DataType cnv(const char *s){ 
    return atoi(s); 
} 

#define PRN_DATA "%d" 

typedef struct stack { 
    DataType data; 
    struct stack *bottom; 
} Stack; 

void push(Stack **stk, DataType x){ 
    struct stack *nstk = malloc(sizeof(Stack)); 

    nstk->data = x; 
    nstk->bottom = *stk; 

    *stk = nstk; 
} 

int empty(Stack *stk){ 
    return stk == NULL; 
} 

DataType pop(Stack **stk){ 
    struct stack *tmp = *stk; 
    if(empty(*stk)){ 
     printf("empty stack\n"); 
     exit(EXIT_FAILURE); 
    } 
    DataType ret = tmp->data; 

    *stk = (*stk)->bottom; 
    free(tmp); 

    return ret; 
} 

char input_from_args(int *argc, const char ***argv){ 
    if(*argc < 2 || (*argv)[1][0] != '-' || (*argv)[1][1] == '\0'){ 
     printf("Option is not specified\n"); 
     exit(EXIT_FAILURE); 
    } 
    char op = (*argv)[1][1]; 
    if((*argv)[1][2] != '\0' || op != 'e' && op != 'c' && op != 'g'){ 
     printf("Option %s is not supported \n", (*argv)[1]); 
     exit(EXIT_FAILURE); 
    } 
    *argv = &(*argv)[2]; 
    *argc -= 2; 
    return op; 
} 

void evaluate(int argc, const char **argv){ 
    struct stack *s = NULL; 
    int i; 
    DataType v1, v2; 
    for(i = 0; i < argc; ++i){ 
     switch(*argv[i]){ 
     case 'A': 
      v2 = pop(&s); 
      v1 = pop(&s); 
      push(&s, v1 + v2); 
      break; 
     case 'S': 
      v2 = pop(&s); 
      v1 = pop(&s); 
      push(&s, v1 - v2); 
      break; 
     case 'X': 
      v2 = pop(&s); 
      v1 = pop(&s); 
      push(&s, v1 * v2); 
      break; 
     case 'D': 
      v2 = pop(&s); 
      v1 = pop(&s); 
      push(&s, v1/v2); 
      break; 
     default: 
      push(&s, cnv(argv[i])); 
     } 
    } 
    printf(PRN_DATA "\n", pop(&s)); 
    if(!empty(s)){ 
     printf("data remains in the stack\n"); 
     exit(EXIT_FAILURE); 
    } 
} 

void convert(int argc, const char **argv){ 
} 

void other (int argc, const char **argv){ 
} 

int main(int argc, const char **argv){ 
    switch(input_from_args(&argc, &argv)){ 
    case 'e': 
     evaluate(argc, argv); 
     break; 
    case 'g': 
     other(argc, argv); 
     break; 
    case 'c': 
     convert(argc, argv); 
     break; 
    } 

    return EXIT_SUCCESS; 
}