簡單計算器(棧的應用)
讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入描述:
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出描述:
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
這個題目主要使用棧來寫,與此同時還要注意符號的優先順序,利用匯編語言學到知識,構造符號棧順利完成表示式的求值。
#include <stdio.h>
#include <string.h>
#define MAX 205
/*
這道題目主要採用棧來求解
為了鍛鍊使用C語言解決問題的能力,這裡通過陣列來模擬棧
*/
struct Node
{
double num;
char op;
int flag;
};
struct Node Stack[MAX];//符號棧
struct Node Queue[MAX];//用來存放字尾表示式
char str1[MAX];
char str2[MAX];
int op[256];
//將中綴表示式轉化為字尾表示式
int Change(int length)
{
double num;
struct Node temp;
int i;
int cnt=0;
int top=0;
for(i=0;i<length;)
{
//如果是運算元
if(str2[i]>='0'&&str2[i]<='9')
{
temp.flag=1;
temp.num=0;
while(str2[i]!='\0'&&str2[i]>='0'&&str2[i]<='9')
{
temp.num=temp.num*10+str2[i]-'0';
i++;
}
Queue[cnt++]=temp;
}
//如果是運算子,則需要先比較運算子與當前棧頂符號的優先順序
//如果棧頂符號優先順序更高,則要加入到佇列陣列當中
//如果優先順序較低的話,則將符號壓入到符號棧當中
else
{
temp.flag=0;
while(top!=0&&op[str2[i]]<=op[Stack[top-1].op])//這裡注意棧頂指標等於棧頂位置+1
{
Queue[cnt++]=Stack[--top];
}
temp.op=str2[i];
Stack[top++]=temp;
i++;
}
}
while(top!=0)//清空棧,構造完整的字尾表示式
{
Queue[cnt++]=Stack[--top];
}
return cnt;
}
double Cal(int cnt)//計算字尾表示式
{
double temp1,temp2;
struct Node cur,temp;
int top=0;
int i,j;
for(i=0;i<cnt;i++)
{
cur=Queue[i];
if(cur.flag==1) Stack[top++]=cur;
else
{
//特別注意top必須加入字首--,因為top指標總是等於棧頂元素位置+1
temp2=Stack[--top].num;//運算元2
temp1=Stack[--top].num;//運算元1
temp.flag=1;
if(cur.op=='+') temp.num=temp1+temp2;
else if(cur.op=='-') temp.num=temp1-temp2;
else if(cur.op=='*') temp.num=temp1*temp2;
else temp.num=temp1/temp2;
Stack[top++]=temp;
}
}
return Stack[top-1].num;
}
int main()
{
op['+']=op['-']=1;
op['*']=op['/']=2;
while(fgets(str1,205,stdin)&&strcmp(str1,"0\n")!=0)
{
int len=strlen(str1);
int i,j=0;
for(i=0;i<len;i++)
{
if(str1[i]==' '||str1[i]=='\n') continue;
else str2[j++]=str1[i];
}
str2[j]='\0';
int cnt=Change(j);
printf("%.2f\n",Cal(cnt));
}
return 0;
}
相關文章
- 簡單計算器 (關於棧的一種應用)
- 表示式計算(棧的應用)
- 簡單混合運算的計算器
- 用java實現一個簡單的計算器Java
- C++簡易計算器自寫棧版C++
- 用JS點選事件做一個簡單的計算器JS事件
- 《論可計算數及其在判定上的應用》簡單理解
- [20211220]sqlplus簡單計算器.txtSQL
- 【Flutter 實戰】簡約而不簡單的計算器Flutter
- HDU_1237 一個簡單的計算器
- Java實現一個簡單的計算器Java
- IOS開發 製作簡單的計算器iOS
- JavaScript簡單計算器程式碼分析JavaScript
- 16_簡單計算器實現
- java方法練習之簡單計算器Java
- Python編寫一個簡單計算器Python
- 7-20 簡單計算器 (20分)
- 0014---簡單的計算
- jsp的簡單應用JS
- 教你python tkinter實現簡單計算器功能Python
- 使用棧實現表示式求值,運用棧計算
- 棧的應用
- 簡單的介紹伺服器和Ajax的應用伺服器
- pythontornodo的簡單應用1Python
- gRPC的Golang簡單應用RPCGolang
- thymeleaf 簡單應用
- div 簡單應用
- 1、簡單工廠模式實現計算器功能模式
- 資料結構與演算法--簡單棧實現及其應用資料結構演算法
- 2 簡單的計算機模型MARIE計算機模型
- 手把手帶你利用棧來實現一個簡易版本的計算器
- python——設計一個簡單的購房商貸月供計算器Python
- python簡易計算器Python
- jQuary中ajax的簡單應用
- @Autowire/@Qualifilter/@Resource的簡單應用Filter
- 並查集的簡單應用並查集
- PHP使用棧完成高階計算器-接上文模擬棧PHP
- 物件導向的例項應用:圖形計算器物件