2015-05-08 22 views
-1

我已经尝试使用atoi然后切换它们回到字符串推,我试图做一个rpn计算器的类,所以推,弹出,寻求和堆栈结构是如何然后需要,但我不能得到它添加整数值。如何添加值,因为它们是字符串?

#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

为什么你坚持把数据存储为字符串呢?如果这是因为您需要能够将运算符存储在同一个堆栈中,请为其添加一个结构成员。 – usr2564301

+0

我已经尝试过了,如果我不保留push,pop,peek和struct等等,或者我会在原始帖子中提到dinged,那么这是一个类。 – user4872257

+1

然后你*做*需要使用'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; 
} 
相关问题