棧的應用——計算器的四則運算
計算器即是四則運演算法則:
我們用的是字尾表示式又稱逆波蘭的方法實現的,例如我們來求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;
}
相關文章
- 四則運算計算器
- 簡單計算器(棧的應用)
- 四則運算
- 表示式計算(棧的應用)
- 簡單計算器 (關於棧的一種應用)
- 用python實現四則運算的生成與判定Python
- 結對程式設計-四則運算程式設計
- 四則運算專案
- 四則運算手冊
- Java簡單四則運算Java
- OJ1038 四則運算
- XJSON 是如何實現四則運算的?JSON
- 四則運算+-×÷同時成立的四連環(2)
- 四則運算+-×÷同時成立的四連環(4)
- 四則運算+-×÷同時成立的四連環(3)
- 四則運算+-×÷同時成立的四連環(1)
- 四則運算+-×÷同時成立的四連環(6)
- 位運算的應用
- 使用棧實現表示式求值,運用棧計算
- 簡單混合運算的計算器
- 結對程式設計 小學四則運算程式設計
- python四則運算生成器Python
- 結對專案四則運算
- java大整數四則運算Java
- 複數的四則運算(C語言實現)C語言
- 軟體工作四則運算測試
- [前端漫談] 做一個四則計算器前端
- 用物件導向的方式操作 JSON 甚至還能做四則運算 JSON 庫物件JSON
- 演算法(3)簡單四則運算演算法
- python資料型別和四則運算Python資料型別
- 結對編碼-四則運算 2252118 2252121
- 課後作業——30道四則運算
- 結對程式設計--自動生成小學四則運算程式設計
- 六十行程式碼完成 四則運算 語法解析器行程
- [記錄] 通用封裝函式——四則運算封裝函式
- c++四則運算結對程式設計 2252416 黃子軒C++程式設計
- 圖文剖析 big.js 四則運算原始碼JS原始碼
- php鏈式操作實現四則鏈式運算PHP
- 結對程式設計——小學四則運算練習題小程式程式設計