輸出序列與表達式轉換-----棧和隊列的應用1

棧和隊列的應用:


一、輸出序列

給定出棧序列判斷棧容量:
在這裏插入圖片描述

  • 如果把圖中出棧序列改爲“入隊後得到的出隊序列”,則出棧序列不變(因爲隊列是先進先出);
  • 如果把圖中出棧序列改爲“入棧後得到的出棧序列”,則出棧序列逆序(因爲棧是先進後出)。

經典例題:已知出棧順序求可能的入棧順序。
在這裏插入圖片描述
要求的出棧順序:
P1、……、Pi、……、Pj、……Pk、……、Pn

可能的入棧順序:
在這裏插入圖片描述
其中只有第四組無法實現,因爲如果最後一個入棧的元素第一個出棧,那麼其餘元素的出棧順序就是固定的,不能亂來。
在這裏插入圖片描述
在這裏插入圖片描述


二、表達式轉換

三種表達式:
1.中綴表達式: a+b
2.前綴表達式(波蘭式): +ab
3.後綴表達式(逆波蘭式): ab+

做法:變換符號位置,然後去括號
1.中綴表達式轉換成前綴表達式:
在這裏插入圖片描述
2.中綴表達式轉換成後綴表達式:
在這裏插入圖片描述
♥設計程序將中綴表達式轉換爲後綴表達式:

輸入格式:
輸入在一行中給出不含空格的中綴表達式,可包含+-*、\以及左右括號(),表達式不超過20個字符。
輸出格式:
在一行中輸出轉換後的後綴表達式,要求不同對象(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
輸入樣例:
2+3*(7-4)+8/4
輸出樣例:
2 3 7 4 - * + 8 4 / +

c++代碼實現:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
typedef long long ll;
stack<char> sta;

int main() {
    map<char,int> mp;
    string str="2+3*(7-4)+8/4";//此例輸出:2 3 7 4 - * + 8 4 / +
    //cin>>str;
    bool isfirst = true;
    mp['-'] = 1,mp['+'] = 1;
    mp['*'] = 2,mp['/'] = 2;
    mp['('] = 3,mp[')'] = 3;
    for(int i = 0; i<str.size(); i++) {
        if(((i==0||str[i-1]=='(') && (str[i]=='+' || str[i] =='-')) || (str[i]>='0'&&str[i]<='9') || (str[i]=='.')) {
            if(!isfirst) {
                cout<<" ";
            }
            if(str[i]!='+') {
                cout<<str[i];
            }
            while(str[i+1]=='.' || (str[i+1]>='0' && str[i+1]<='9')) {
                i++;
                cout<<str[i];
            }
            isfirst = false;
        } else {
            if(str[i]==')') {
                while(!sta.empty() && sta.top()!='(') {
                    cout<<' '<<sta.top();
                    sta.pop();
                }
                sta.pop();
            } else if(sta.empty()||mp[str[i]] > mp[sta.top()]) {
                sta.push(str[i]);
            } else {
                while(!sta.empty() && sta.top()!='(') {
                    cout<<' '<<sta.top();
                    sta.pop();
                }
                sta.push(str[i]);
            }
        }
    }
    while(!sta.empty()) {
        cout<<' '<<sta.top();
        sta.pop();
    }
    return 0;
}
/*
1、建一個空棧儲存運算符
2、當碰到數字直接輸出,值的注意的是這裏的數字可能是小數、負數(負號和數字是一起輸出的)或帶正號的數字;
3、當碰到運算符的時候,先比較當前符號a與棧頂符號b運算優先級的大小,如果a > b直接壓入棧中,否則就輸出棧中的運算符直到爲空或棧頂元素爲‘(’;
4、當碰到')'運算符的時候,直接輸出棧中的運算符,直到棧爲空或者碰到運算符'(';
5、最後輸出棧中的運算符,直到棧爲空。
6、最卡格式的一種情況就是運算符和右括號連續出現的情況比如2+(+5)-1,要仔細考慮輸出格式的處理;
7、‘+’,‘-’和數字一起輸出的情況是正負號的在字符串的第一位或者是正負號前邊是‘(’,其餘情況都是作爲運算符處理的。
*/

3.後綴表達式轉換成中綴表達式:
在這裏插入圖片描述
4.後綴表達式轉換成前綴表達式:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章