用棧實現的計算器

2021-07-31 15:58:15 字數 2274 閱讀 7430

問題描述:

描述

從鍵盤輸入乙個算術表示式(保證是整數)並輸出它的結果(保證資料中除法是整除)

輸入 輸入一行字串表示算術表示式包括0..9,+,-,*,/,(,)

輸出 每行輸出計算結果

規則:

1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。

2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。

3.遇到左括號一律進運算子棧,右括號一律不進運算子棧。在遇到對應的右括號前,括號內運算按規則2進行,當遇到右括號時,將括號內運算結果進運算元棧,並取出左括號。

### 優先順序處理

如果我們使用if結構處理這裡的優先順序問題,由於組合眾多,必然是紛繁複雜。所以試圖尋找相對簡潔的辦法

思路一:

1. 我們知道,加減的優先順序低於乘除,括號的優先順序最高。。。。。那麼是否意味著可以通過給運算子分配乙個代表優先順序的屬性,每次比較該屬性值的大小。加減法等級為5,乘除法為10,左括號為100 右括號為0 (給定的等級差距足夠大)

2. 當兩個運算子優先等級相同時(如加法遇上除法),應當先算前面的,即可以是對 * front+1 * 和 * back * 進行比較,利用這個來處理同等級的優先順序問題。

3. 左括號優先順序最高,右括號優先順序最低

思路二:

1. 將所有的優先順序比較列入表中,每一對組合對應陣列中的乙個代表優先順序關係的值,每次通過分析運算元的組合,然後根據座標定位來確定操作。

對於第乙個數是負數,需要另外處理

思路一:

對於第乙個數為負數,即最先入棧的是乙個負號,可以在數字棧內補乙個0

讀取一行資料,若測試oj最後沒有輸入』\n』,則需要手動新增結束符

對於確定取操作符的優先順序表內的座標時,對於非表內的字元,應當給乙個合適的返回值

#include

#include

#include

using

namespace

std;

struct node ;

int priority[7][7] = ;

int check_empty(node* top) //檢查棧內是否為空

node* push(node* top, int x) //壓棧

return top;

}node* pop(node* top, int& x) //彈棧

else

}int get_top(node* top) //讀取棧頂元素

else

return top->data;

}int sub(int c) //用於確定操作符在優先順序表內的座標

return -1;

//缺少這句導致之前一直報錯 (本地所有組測試都能過,但是oj一直過不了),

//推測是因為對於操作符空棧的情況,當讀入乙個操作符時 ,需要讀取符號棧內當前的操作符進行優先順序比較,而符號棧內現在為空

//雖然不會觸發priority==3或者==1或者==2,按照程式的邏輯這是屬於else情況,直接將此操作符入棧。

//但是這裡是乙個不穩的因素,當前的操作符對應的優先順序是乙個隨機的數,這會造成嚴重的後果。

//以及如果第一輸入的個數為負數 ,並且下乙個輸入的操作符使得當前操作符棧內的負號能夠進行計算的話,需要從資料棧內提取出兩個數,

//但是資料棧內目前只有乙個數,會出現越界。這裡提供另一種簡明的解決思路:在資料棧內先壓入乙個0.

}int main()

continue;//跳出當前while迴圈,下一次while迴圈時,仍舊為當前的ch

}else

if (priority[i][j] == 1)

else

if (priority[i][j] == 2)

else

}else

ch = getchar(); //讀取下乙個字元

}cout

<< get_top(num);

return

0; //system("pause");

}

writen by scaactk

guided by ms dong

用棧實現計算器

我們平時用swith語句寫的計算器,只能處理簡單的兩個運算元和乙個運算子,這樣其實和日常應用方面差的有點遠,所以我們今天學習了一種用棧來實現一條複雜表示式的計算。這個需要用到棧的相關知識,除此之外我們還需要學會如何把中綴轉換成字尾表示式,比如 3 4 5 2 3這樣乙個表示式,從左至右遇到運算元壓入...

C C 用棧實現計算器

使用棧實現計算器,最主要的就是進行運算子的優先順序判斷,然後進行對應的計算,然後將其壓入棧和從棧中取出來。其中要對輸入的表示式進行判斷,如果表示式不符合的話就直接不用計算。下面直接上 include include include using namespace std const int maxs...

用棧實現基本計算器

趣味 演示 1.3 演示 實現乙個基本的計算器來計算乙個簡單的字串表示式 s 的值。示例 1 輸入 s 1 1 輸出 2 示例 2 輸入 s 2 1 2 輸出 3 因為睡眠不好的原因,總覺得頭脹脹的,精神狀態不好,但每日演算法的斷更又是我所不能接受的。所以這一篇我就用了力扣官方的題解,來為大家解析一...