利用栈 做一个简单的计算器系统

来源:互联网 发布:穿越火线交易软件 编辑:程序博客网 时间:2024/05/25 05:36
#include <stdio.h>#include <stdlib.h>#define OK    1000001#define ERROR 1000002struct node {    int data;    struct node *next;};typedef struct node Node;struct stack{    Node *top;    int count;};typedef struct stack Stack;int InitStack(Stack *S){    S->top = NULL;    S->count = 0;    return OK;}int EmptyStack(Stack *S){    return (S->count == 0) ? OK : ERROR;}int PUSH(Stack *S,int e){    Node *p = (Node *)malloc(sizeof(Node));    if(p == NULL)    {        return ERROR;    }    p->data = e;    p->next = S->top;    S->top = p;    S->count++;    return OK;}int GetTop(Stack *S){    if(NULL == S->top)    {        return ERROR;    }    return (S->top->data);}int Priority(char s){    switch(s)    {        case '(':            return 3;        case '*':        case '/':            return 2;        case '+':        case '-':            return 1;        default:            return 0;    }}int Pop(Stack *S){    int e;    if(NULL == S->top)    {        return ERROR;    }    Node *p = S->top;    e = p->data;    S->top = p->next;    free(p);    S->count--;    return e;}int main(){    Stack num,opt;    char str[100] = {0};    int i = 0, tmp = 0, j;    if(InitStack(&num) != OK || InitStack(&opt) != OK)    {        printf("Init Failure!\n");        exit(1);    }    printf("Please Input Operator :\n");    scanf("%s",str);    while(str[i] != '\0' || EmptyStack(&opt) != OK)    {        if(str[i] >= '0' && str[i] <= '9')        {            tmp = tmp * 10 + str[i] - '0';            i++;            if(str[i] < '0' || str[i] > '9')            {                PUSH(&num,tmp);                tmp = 0;            }        }        else         {            if((EmptyStack(&opt) == OK) || (GetTop(&opt) == '(' && str[i] != ')') || Priority(str[i]) > Priority(GetTop(&opt)))            {                PUSH(&opt,str[i]);                i++;                continue;            }            if(GetTop(&opt) == '(' && str[i] == ')')            {                Pop(&opt);                i++;                continue;            }            if((str[i] == '\0' && EmptyStack(&opt) != OK) || (str[i] == ')' && GetTop(&opt) != '(') || Priority(str[i]) <= Priority(GetTop(&opt)))            {                switch(Pop(&opt))                {                    case '+':                        PUSH(&num, Pop(&num) + Pop(&num));                        break;                    case '-':                        j = Pop(&num);                        PUSH(&num,Pop(&num) - j);                        break;                    case '*':                        PUSH(&num,Pop(&num) * Pop(&num));                        break;                    case '/':                        j = Pop(&num);                        PUSH(&num,Pop(&num) / j);                        break;                }                continue;            }        }    }    printf("result is %d\n",Pop(&num));    return 0;}