棧的應用——計算器的四則運算
計算器即是四則運演算法則:
我們用的是字尾表示式又稱逆波蘭的方法實現的,例如我們來求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;
}
相關文章
- 四則運算計算器
- Object-C,四則運算計算器Object
- 簡單計算器(棧的應用)
- 四則運算
- 四則運算的開發
- 表示式計算(棧的應用)
- 利用ANTLR4實現一個簡單的四則運算計算器
- 結對程式設計-四則運算程式設計
- 四則運算GUI版本GUI
- 四則運算小程式
- 四則運算----封裝封裝
- 安卓版四則運算安卓
- 四則運算——安卓版安卓
- 四則運算專案
- 四則運算手冊
- 簡單計算器 (關於棧的一種應用)
- 軟體工程設計之四則運算軟體工程
- 用python實現四則運算的生成與判定Python
- Java簡單四則運算Java
- 四則運算之總結
- 四則運算介面練習
- 帶介面的四則運算
- 四則運算--封裝5.1封裝
- 四則運算app總結APP
- 個人專案--四則運算
- 四則運算實現 (轉)
- 使用棧實現表示式求值,運用棧計算
- 位運算的應用
- 簡單混合運算的計算器
- 結對程式設計專案-四則運算程式設計
- 結對程式設計 小學四則運算程式設計
- java大整數四則運算Java
- 四則運算之主要程式碼
- 作業:隨機四則運算隨機
- 安卓小學生四則運算安卓
- 結對專案四則運算
- XJSON 是如何實現四則運算的?JSON
- 程式碼·--四則運算的主要核心程式碼