1. 程式人生 > >逆波蘭式的產生與計算

逆波蘭式的產生與計算

生成逆波蘭式流程圖:

生成逆波蘭式流程圖

逆波蘭式的計算流程圖:

逆波蘭式的計算流程圖

要求:

可以區分小數點、乘方、正負號

程式碼:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cctype>
#include<cstring>
using namespace std;

char str[50];   //用於存放原來的表示式
int top;    //棧頂指標
char stack[50];     //定義棧,用於計算逆波蘭式
char ex[50]; //存放字尾表示式 double _stack[50]; //定義棧,用於計算逆波蘭式子 int flag[50]; //用於區分+、-號的含義,0表示運算子,1表示正負號 //生成逆波蘭式 void NiBolan() { memset(flag,0,sizeof(flag)); //flag初始值設為0 char ch=str[0]; int i=1,t=0; top=0; while(ch!='#') { switch(ch) { case '(': top++; stack
[top]=ch; break; case ')': while(stack[top]!='(') { ex[t]=stack[top]; top--; t++; } top--; break; case '^': while(stack[top]=='^') //設定^運算子優先順序為最高 { ex[t]=stack
[top]; top--; t++; } top++; stack[top]=ch; break; case '+': case '-': //當ch為+、-號是,若前面相鄰字元不是')'或數字且後面相鄰字元是數字時表示正負號 if(isdigit(str[i]) && !isdigit(str[i-2]) && str[i-2]!=')') { flag[t]=1; //標記符號為正負號 ex[t++]=ch; ch=str[i++]; while((ch>='0'&&ch<='9')||ch=='.') //判別小數點 { ex[t]=ch; t++; ch=str[i]; i++; } i--; ex[t]='&'; t++; } else { while(top!=0&&stack[top]!='(') { ex[t]=stack[top]; top--; t++; } top++; stack[top]=ch; } break; case '*': case '/': while(stack[top]=='*'||stack[top]=='/'||stack[top]=='^') //運算子^優先順序高於*和/ { ex[t]=stack[top]; top--; t++; } top++; stack[top]=ch; break; case ' ': break; default: while((ch>='0'&&ch<='9')||ch=='.') //判別小數點 { ex[t]=ch; t++; ch=str[i]; i++; } i--; ex[t]='&'; t++; } ch=str[i]; i++; } while(top!=0) if(stack[top]!='(') { ex[t]=stack[top]; t++; top--; } else { printf("error"); top--; exit(0); } ex[t]='#'; ex[t+1]='\0'; printf("字尾表示式:%s\n",ex); } //計算逆波蘭式 void Calculate() { char ch=ex[0]; int t=0; top=-1; while(ch!='#') { if(ch=='&'){ ch=ex[++t]; continue; } switch(ch) { case '+': if(flag[t]) //'+'表示正號 { ch=ex[++t]; double d=0; while(ch>='0'&&ch<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') //判斷是否為小數 { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=d; } else { _stack[top-1]=_stack[top-1]+_stack[top]; top--; t++; } break; case '-': if(flag[t]) //'-'表示負號 { ch=ex[++t]; double d=0; while(ch>='0'&&ch<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=-d; } else { _stack[top-1]=_stack[top-1]-_stack[top]; top--; t++; } break; case '^': //運算子為'^' if(_stack[top]==0) { _stack[top-1]=1; } else { int temp; temp=_stack[top-1]; while(--_stack[top]) { _stack[top-1]*=temp; } } top--; t++; break; case '*': _stack[top-1]=_stack[top-1]*_stack[top]; top--; t++; break; case '/': if(_stack[top]!=0) _stack[top-1]=_stack[top-1]/_stack[top]; else { printf("\n\tchu0error!\n"); exit(0); } top--; t++; break; default: double d=0; while(ch>='0'&&ch<='9') { d=10.0*d+double(ch-'0'); ch=ex[++t]; } if(ch=='.') //判斷是否為小數 { ch=ex[++t]; double k=1.0; while(ch>='0'&&ch<='9') { d=d+double(ch-'0')/(10.0*k); k=k+1.0; ch=ex[++t]; } } top++; _stack[top]=d; } ch=ex[t]; } cout<<"計算結果:"<<_stack[top]<<endl; //printf("計算結果:%lf\n",_stack[top]); } int main() { printf("請輸入中綴表示式:"); scanf("%s",&str); //輸入原表示式 printf("原來表示式:%s\n",str); NiBolan(); //生成逆波蘭式 Calculate(); //計算逆波蘭式 return 0; } // 測試樣例 結果 // 21+((42-2)*15+6)-18# 609 // 1+(-5)+-3*-1# -1 // 1+2^3*2# 17 // 1+-2^3*2# -15 // 1+(1-3)^3# -7 // 1*2^0# 1

執行結果:
這裡寫圖片描述

相關推薦

波蘭產生計算

生成逆波蘭式流程圖: 逆波蘭式的計算流程圖: 要求: 可以區分小數點、乘方、正負號 程式碼: #include<iostream> #include<stdio.h> #include<stdlib.h>

波蘭的轉換計算(簡單)

我們平常書寫的表示式:--如2+3*4+4 又稱為中綴表示式,我們可以將它轉換為字尾表示式 213*+4+ 輸入有兩行,第一行為逆波蘭式的結果,第二行為輸入表示式的正確計算結果。逆波蘭式中相鄰的數字或運算子之間不用輸出空格 保證表示式計算的合理性,不需判斷除零等情況

波蘭計算(含有數學函式和浮點數)

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define MAX 100 #define MARK 65535 typed

計算表示式的值c++波蘭實現方法

#include<stack>//棧容器的標頭檔案 #include<iostream> #include<math.h> //數學 標頭檔案 次方函式 using namespace std; int Precedence(char

HDU1237 簡單計算器 【棧】+【波蘭

a + b gree rac 簡單計算器 data- 3.0 center 一個空格 har 簡單計算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe

JavaScript中綴表達轉為波蘭(四則運算)

。。 刪除 並且 asc 情況 暫存 運算符 pan true 實現過程: 1.首先創建兩個空數組,result用來存放結果,temp用來存放符號;再創建一個符號集ops存放+-*/符號 2.轉表達式字符為數組,開始遍歷數組 3.如果遇到運算符,直接推入結果數組 4.遇到括

數據結構——波蘭

算法 指定 spa code eva eve != AD case 很久沒有關註算法和數據結構,大部分知識都已經忘記了;是時間好好回爐一下了,說實話幹讀數據機構這本書還是挺枯燥而且這本書原理性比較多,有一定的難度。這不剛看到逆波蘭式廢了好大勁才搞懂,老了。。。 逆波蘭式

排序、堆疊、佇列、連結串列、遞迴、波蘭波蘭

氣泡排序 選擇排序:https://segmentfault.com/a/1190000009366805 插入排序 希爾排序:https://segmentfault.com/a/1190000009461832 歸併排序 快速排序:https://segment

java 實現 中序表示式轉後序表示式(波蘭) 以及 後序表示式求值

第一次寫部落格,還是個學生,沒有什麼經驗,只是單純的記錄下自己實現一個問題的方法與思想,如有錯誤之處,請各路大神批評指出。 大概思想:跟參考部落格的思想差不多,單程式碼完全自己思考,實現過程有較多的if..else語句 看起來可能會有點暈。各處都有註釋有不懂的可以私信我

波蘭(字尾

逆波蘭式式波蘭邏輯學家盧卡西維奇發明的一種表示表示式的方法。這種表示方法把運算子寫在運算物件的後, 例如把a+ba+ba+b寫成 ab+ab+ab+,所以也稱為字尾式。這種表示法的有嗲你是根據運算物件和運算子的出現次序進行計算,不需要使用括號,也便於用棧來求值。

波蘭(字尾表示式)的表達求值

逆波蘭表示式求值 [編輯]虛擬碼 while有輸入符號 讀入下一個符號IF是一個運算元 入棧ELSE IF是一個操作符 有一個先驗的表格給出該操作符需要n個引數IF堆疊中少於n個運算元 (錯誤) 使用者沒有輸入足夠的運算元Else,n個操作數出棧計算操作符。將計算所得的

【資料結構】中綴表示式轉換字尾表示式(波蘭

我的第一篇博文就是關於逆波蘭式的,現在回頭看感覺當時的程式碼太過混亂(不忍直視),在這裡對當時的程式碼進行一次重構。 #include <stdio.h> #include <s

表示式求值(波蘭)

表示式求值 時間限制:3000 ms  |  記憶體限制:65535 KB 難度:4 描述ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。 比如輸入

波蘭表示式實現表示式計算

表示式求值計算,如計算1+((2+3)*4)-5的值。 我的思路是先把表示式轉換為逆波蘭表示式,因為逆波蘭表示式更加符合計算機的處理邏輯,把表示式轉換為逆波蘭表示式的演算法如下: 初始化兩個棧:運算子棧s2和儲存中間結果的棧s1; 從左至右掃描中綴表示式; 遇到運算元時,將

字首表示式(波蘭)的計算

字首表示式的計算也是可以用遞迴來做 可以把表示式的結構拆分為三個:運算子 字首表示式 字首表示式 也就是說,數字也可以作為字首表示式,而表示式的值就是數字本身,所以當讀取完一個運算子之後,就可以按照

將中綴表示式轉化為波蘭(c++實現)

<pre name="code" class="cpp">/************************************************************************* > File Name: ReversePol

C程式設計語言波蘭計算器學習心得

#include<stdio.h> #include<stdlib.h> #define MAXOP 100 //這個是最大一次輸入的長度 #define NUMBER '0' //一個標誌,意味著接收到的是數字,換成其他也無妨 int getop(char[]);//宣告函式,

表示式求值運算(波蘭

逆波蘭式:中綴表示式,字尾表示式等內容可百度檢視。運算表示式  2+3*(1+2)-6/3開兩個棧,一個存數字,一個存符號。當 遇到這種情況1:需要先計算後面的內容,再回來計算前面的運算讓符號進棧暫時儲

LeetCode | Evaluate Reverse Polish Notation(波蘭求值)

Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an int

C語言利用棧實現將中綴表示式轉換為字尾表示式(即波蘭

輸入計算表示式如:(1-3)*4+10/5 輸出的逆波蘭式:1  3  -  4  * 10  5  /   + 碼程式碼時臉上洋溢著的神祕的微笑 #include <stdio.h> #include <stdlib.h> #include