棧的應用——計算器的四則運算

mf1crystal發表於2017-12-04

計算器即是四則運演算法則:
我們用的是字尾表示式又稱逆波蘭的方法實現的,例如我們來求9+(3-1)X3+10/2
字尾表示式為931-3*+102/+
規則是從左往右遍歷表示式的每個數字和符號,遇到數字就進棧,遇到符號就將處於棧頂兩個數字出棧,進行運算,一直到最終獲得結果。

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


#define OK     10000001
#define ERROR  10000002


struct 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");
}


printf("Please Input Op
erator :\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;
}

相關文章