SDUT-2132 一般算數式轉字尾表示式 and STL stack 的基本使用
題目描述
Problem Description
對於一個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。
Input
輸入一個算術表示式,以‘#’字元作為結束標誌。
Output
輸出該表示式轉換所得到的字尾式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
start
一般的算數表示式轉化為字尾(逆波蘭)式,是棧的一個經典應用,首先來看一下這個轉化過程的方法,表示式自左向右掃描:
- 如果是數字(準確說是非運算子,括號)就直接輸出為字尾式的一部分;
- 如果是 ‘(’ 直接進棧;
- 如果是 ‘)’ 則彈出棧頂元素,直到遇到 ‘(’ 為止,並將 ‘(’ 刪除; ( ‘(’ , ‘)’ 不會在後綴表示式中 )
- 如果當前的運算子的優先順序小於等於棧頂元素(且非 ‘(’ )的優先順序(優先順序簡單來說就是我們進行四則運算的規則,乘除高於加減),則將棧頂元素輸出,注意這裡應該是一個迴圈,不斷的出棧輸出,知道遇到棧頂元素優先順序大於當前元素或者遇到 ‘(’ 為止;
- 如果掃描完成,棧不為空(大部分都不為空)則依次輸出棧頂元素;
這就是整個轉化過程了 ,以上面題目中的表示式為例子(a*b+(c-d/e)*f):
- 首先是a,直接輸出;
- *入棧;
- b 直接輸出;
- 遇到 +,則與站定比較優先順序,* 的優先順序更高,所以輸出 * ,(迴圈,這裡彈出 * 之後是空棧了,所以結束了),並把 + 入棧 ;
- ( 直接入棧;
- c 直接輸出;
- 判斷優先順序,棧頂是 ( ,所以直接入棧;
- d 直接輸出;
- / 比 棧頂元素 - 的優先順序高,所以不彈出,直接入棧;
- e直接輸出;
- ) 開始尋找 ) 依次彈出 / - 這時候棧頂為 ( ,把 ( 刪除(彈出);
- 判斷棧頂元素,為 + 優先順序高於 + ,所以入棧;
- f 直接輸出;
- 至此表示式掃描完成,依次將棧彈出 * +;
這樣整個過程就結束了。
程式碼:
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
using namespace std;
int main(){
string str;
cin>>str;
stack<char> s;
int k=0;
for(int i=0; i<str.length()-1; i++){
if(str[i]!='+' && str[i]!='-' && str[i]!='*' && str[i]!='/' && str[i]!='(' && str[i]!=')') //在這個題目中改成>='a' <='z'也行。。
cout<<str[i];
else if(str[i] == '(')
s.push('(');
else if(str[i]==')'){ //右括號,一直輸出到遇見左括號為止
while(s.top()!='('){
cout<<s.top();
s.pop();
}
s.pop();
}
else if(str[i]=='*'||str[i]=='/'){ //對於加減乘除,如果遇到乘除,則判斷棧頂必須要是乘除(優先順序相同才輸出)
while(!s.empty() && ( s.top()=='*'||s.top()=='/')){
cout<<s.top();
s.pop();
}
s.push(str[i]); //最後要將這個元素入棧
}
else if(str[i]=='+'||str[i]=='-'){
while(!s.empty() && ( s.top()=='*'||s.top()=='/'||s.top()=='+'||s.top()=='-')){ //如果是加減,棧頂為加減乘除都要彈出(優先順序比較關係)
cout<<s.top();
s.pop();
}
s.push(str[i]);
}
}
while(!s.empty()){ //最後輸出全部的剩餘符號
cout<<s.top();
s.pop();
}
}
這裡沒有自己實現棧的基本操作,因此在這裡簡要介紹一下STL 中stack 的使用方法:
使用標準模板庫中的棧,要在標頭檔案中新增 stack
.
棧的基本方法無非是新建棧,入棧,出棧,取棧頂元素等:
一切接在程式碼中…(。・∀・)ノ
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> s; //<>中是棧的元素型別可以是double,string等等
int temp;
for(int i=0; i<5; i++){
cin>>temp;
s.push(temp); //入棧操作
}
cout<<"Size: "<<s.size()<<endl; //棧的大小
cout<<"Top element: "<<s.top()<<endl; //取棧頂元素,不會pop
while(!s.empty()){ //判斷棧是否為空
cout<<s.top()<<" ";
s.pop(); //彈出棧頂元素
}
}
end~
相關推薦
SDUT-2132 一般算數式轉字尾表示式 and STL stack 的基本使用
題目描述 Problem Description 對於一個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。 Input 輸入一個算術表示式,以‘#’字元作為結束標誌。 Output 輸出該表示式轉換所得到的字尾式。 Sample Inpu
資料結構 中綴表示式轉字尾表示式 C/C++
思路: 掌握 運算子高進低出的原則,再結合棧結構儲存特點 #include<iostream> using namespace std; template<class Type> struct Node { Type data; struct Node *
中綴表示式 轉字尾表示式
#include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct Stack { char *base, *top; int size; }Sta; void init
中綴表示式轉字尾表示式(c++)
初始化兩個棧:運算子棧s1和儲存中間結果的棧s2; 從左至右掃描中綴表示式; 遇到運算元時,將其壓s2; 遇到運算子時,比較其與s1棧頂運算子的優先順序: 如果s1為空,或棧頂運算子為左括號“(
javascript 中綴表示式轉字尾表示式
這篇博文寫的很好,思路很不錯,但是演算法有錯誤,於是更正轉到自己部落格上。大家一起學習。 function Stack(){ this.dataStore = []; this.top = 0; this.push = push; thi
中綴表示式轉字尾表示式
理論知識 demo.cpp #define _CRT_SECURE_NO_WARNINGS #include "LinkStack.h" #include<stdio.h> #include<stdlib.h> #include<
DS-013 棧-中綴表示式轉字尾表示式
方法1:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序不高於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出
(棧)C++中綴表示式轉字尾表示式(可處理多位數字)
題目描述:輸入合法的算術表示式(中綴表示式),輸出原始字串,轉換後的字尾表示式,以及計算結果。 題目考察點:棧的應用,掌握棧先入後出的特點。 演算法思路:中綴表示式轉字尾的演算法採用排程場演算法。當讀入一個數字,就將數字輸出;當讀入一個運算子時,如果此時運算子棧為空就將運算子壓棧,如果運算子
C語言實現括號匹配,中綴表示式轉字尾表示式並計算的演算法
1.將中綴表示式轉換為字尾表示式的演算法: (1) 初始化兩個棧:運算子棧S1和儲存中間結果的棧S2; (2) 從左至右掃描中綴表示式; (3) 遇到運算元時,將其壓入S2; (4) 遇到運算子時,比較其與S1棧頂運算子的優先順序: Ø (4-1)如果S1為空,或棧頂運算子
中綴式轉字尾式工具類實現
我們經常用到的表示式叫中綴式,如:1+2,a+b*c; 還有另外一種表示式叫字尾式,叫逆波蘭式。 原理我就不贅述了,網上很多介紹。 現在寫了個Java中綴式轉字尾式的工具類,現分享原始碼如下: 操作符常量介面: /** * <pre> * 操作符常量介面:主
中綴表示式轉字尾表示式求值(棧的應用)
咱們熟悉的四則運算表示式,中綴表示式,例如 (12+3)*2-6/2 利用堆疊的方法把中綴表示式轉換成保值的字尾表示式(又稱逆波蘭表示法),並最終變為計算機可以直接執行的指令,得到表示式的值 挺簡單的不假,也好理解,但就是一直無緣無故的卡著,卡的蛋疼…… 也不能說完全的無
C++資料結構與STL--棧的應用--中綴表示式轉字尾表示式
#ifndef in_post_convert_H #define in_post_convert_H #include<string> #include<stack> #include"op_priority.h" using std::string; using std::st
逆波蘭式(字尾表示式)的表達求值
逆波蘭表示式求值 [編輯]虛擬碼 while有輸入符號 讀入下一個符號IF是一個運算元 入棧ELSE IF是一個操作符 有一個先驗的表格給出該操作符需要n個引數IF堆疊中少於n個運算元 (錯誤) 使用者沒有輸入足夠的運算元Else,n個操作數出棧計算操作符。將計算所得的
C++ 中綴表示式轉字尾表示式
一、思路:和中綴表示式的計算類似,只不過不用計算,把表示式輸出即可 1.用字元陣列儲存整行輸入的中綴表示式; 2.接著從字元陣列的0位置開始判斷字元,如果是數字,那就要
C語言 實現中綴表示式轉字尾表示式並求值
大一菜鳥,初學程式設計,這是我的第一篇部落格,希望能用部落格記錄我的成長之路。 初學資料結構,剛接觸連結串列和棧,看到有中綴表示式轉字尾的題就試著實現了一下。下面貼上程式碼。因為使用的是字元型變數,所以只能計算個位數。 /* 堆疊練習——中綴表示式轉
java實現中綴表示式轉字尾表示式並且計算
自己寫一個棧 用陣列實現package cn.itcast.StackAndQuen; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Created
c++利用棧簡單實現四則中綴表示式轉字尾表示式,並算值。
最近在學習資料結構與演算法,學到棧這裡,就基於棧實現了一個簡答四則表示式算值的程式。平時我們寫的那 種表示式就是中綴,而計算機處理中綴是不佔優勢的一般都是將中綴轉成字尾再計算值,在這裡我也利用這個思路, 將中綴表示式分為以下兩部: A.中綴表示式轉成
中綴表示式轉字尾表示式(c語言)
#include<stdio.h>#include<string.h>typedef struct node{ char s[310]; int top;}Stack;int weight(char ch, int flag){ if(ch=='+'||ch=='-'
棧應用2 中綴表示式轉字尾表示式
為了簡單起見,我們只考慮簡單的加減乘除計算 一、演算法邏輯 1)從左向右掃描字尾表示式 2)初始化棧 3)遍歷表示式,直至掃描完所有字元 4)如果被掃描的字
中綴表示式轉字尾表示式並進行計算 原理
在計算一個表示式的時候,可以用資料結構中棧的知識,將我們平常熟悉的中綴表示式轉為字尾表示式,再將字尾表示式進行計算得到結果。先說下什麼是中綴什麼是字尾: 中綴表示式:eg: 9+(3-1)*3+10/2,就是我們平常計算時的表示式; 字尾表示式:eg: 9 3 1 - 3