1. 程式人生 > >SDUT-2132 一般算數式轉字尾表示式 and STL stack 的基本使用

SDUT-2132 一般算數式轉字尾表示式 and STL stack 的基本使用

題目描述

Problem Description

對於一個基於二元運算子的算術表示式,轉換為對應的字尾式,並輸出之。
Input

輸入一個算術表示式,以‘#’字元作為結束標誌。
Output

輸出該表示式轉換所得到的字尾式。
Sample Input

a*b+(c-d/e)*f#
Sample Output

ab*cde/-f*+

start

一般的算數表示式轉化為字尾(逆波蘭)式,是棧的一個經典應用,首先來看一下這個轉化過程的方法,表示式自左向右掃描:

  1. 如果是數字(準確說是非運算子,括號)就直接輸出為字尾式的一部分;
  2. 如果是 ‘(’ 直接進棧;
  3. 如果是 ‘)’ 則彈出棧頂元素,直到遇到 ‘(’ 為止,並將 ‘(’ 刪除; ( ‘(’ , ‘)’ 不會在後綴表示式中 )
  4. 如果當前的運算子的優先順序小於等於棧頂元素(且非 ‘(’ )的優先順序(優先順序簡單來說就是我們進行四則運算的規則,乘除高於加減),則將棧頂元素輸出,注意這裡應該是一個迴圈,不斷的出棧輸出,知道遇到棧頂元素優先順序大於當前元素或者遇到 ‘(’ 為止;
  5. 如果掃描完成,棧不為空(大部分都不為空)則依次輸出棧頂元素;

這就是整個轉化過程了 ,以上面題目中的表示式為例子(a*b+(c-d/e)*f):

  1. 首先是a,直接輸出;
  2. *入棧;
  3. b 直接輸出;
  4. 遇到 +,則與站定比較優先順序,* 的優先順序更高,所以輸出 * ,(迴圈,這裡彈出 * 之後是空棧了,所以結束了),並把 + 入棧 ;
  5. ( 直接入棧;
  6. c 直接輸出;
    • 判斷優先順序,棧頂是 ( ,所以直接入棧;
  7. d 直接輸出;
  8. / 比 棧頂元素 - 的優先順序高,所以不彈出,直接入棧;
  9. e直接輸出;
  10. ) 開始尋找 ) 依次彈出 / - 這時候棧頂為 ( ,把 ( 刪除(彈出);
    • 判斷棧頂元素,為 + 優先順序高於 + ,所以入棧;
  11. f 直接輸出;
  12. 至此表示式掃描完成,依次將棧彈出 * +;

這樣整個過程就結束了。
程式碼:

#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