自定義運算子 @,
#,$,&,並且優先順序@>#>$>&,利用下面的計算法則,計算出乙個給定的字串表示的表示式的值,返回整型結果。
x@y = (x-1)*(
y+1);
x#y = (2*x+5)*(3*y+60)
x$y = (x+1)*(
2*x+3)*(
y-1)*(
2*y-3)
x&y = ((x+y+1)*(
y-9)+(x+7)/(y-8))
輸入:接受多行輸入,每行可能有空格。題目保證不會出現除數為0的情況,且所有運算元都是整數。為了簡單起見,表示式不含有括號。
輸出:對於每一行輸入,輸出乙個運算結果。
輸入樣例:1@2
1#21@1
@11#1#11$1
$11&1&1
1#1@11@1
#11$1&1
1&1$1
1# 1 & 1
12 @ 12
123 @ 123
輸出:0
462
-255881
0186
420315
-17-19
-3608
14315128
分析:
大體來看,程式主要流程為這麼幾步
1. 將得到的字串進行去空格處理。
2. 將第1步得到的字串(此為中綴形式)轉換為逆波蘭式(字尾式)
3. 將第2步得到的逆波蘭式(rpn)進行計算,求出結果並輸出。
核心演算法偽**:
1. 將中綴形式轉化為字尾形式:
從左往右掃瞄inputstring
if 當前掃瞄的是運算元
輸出該運算元
else
//當前掃瞄的是操作符
while 無限迴圈
if 棧為空 或 棧頂元素優先順序小於該操作符
該操作符入棧
break
else
輸出棧頂元素,並pop
//掃瞄inputstring完畢
while 棧內還有元素
輸出棧頂元素,並pop
2.將字尾形式計算為結果
從左往右順序掃瞄inputrpn
if 當前掃瞄的是運算元
該運算元入棧
else
//當前掃瞄到的是操作符
從棧中彈出兩個運算元,參加該操作符的運算
運算結果入棧
注意細節:
1. 在由於要處理76 @ 321
這樣的多位運算元,因此在轉換rpn的時候要注意順帶進行atoi的操作。
2. 若直接用cin>>進行初始化輸入的操作,題目中的空格被隔斷成多個字串,比如這種輸入123 @ 123
,因此要使用getline來進行初始化操作。
成品**:
使用c++11 mode下的gcc編譯通過。
#include
#include
#include
#include
using
namespace
std;
class marscalc
private:
map querypriority = map
, , , };
string removespcace(string inputstr)
vector
converttorpn(string inputstr) else else }}
}rpn2.push_back(atoinumber);
while (operatorstack.empty() == false)
return rpn2;
}int calcrpn(vector
inputrpn) else
}return numberstack.top();
}int domarscalc(int num1, int num2, int operate)
}};int main()
return
0;}
華為2023年實習生招聘考試試題
第一題 描述 目描述 編寫乙個函式,將字串中的大寫的字母 a z 挑出來,同時保留原字串中的空格,將挑出的大寫字母和空格按原始位置組成新的字串。例如 1 輸入 australia 輸出 aus 2 輸入 he is a dog 輸出 h i dg 執行時間限制 1 sec 記憶體限制 128 mby...
華為實習生筆試題及解答
3月27日做了華為筆試,3道題2小時。當時沒有拍照,現在憑記憶將題目和 敘述一遍,方便後人。前面將把三道題分別列一下,供後來者自己做。在後面說明一下自己的寫法 下面是各題做法和思路 第一題 題目說的比較複雜,讀懂題意之後大致是,9個字元一組,每組的第乙個字元是標誌位,後面8個字元是位址。如果標誌位是...
筆試面試 2015華為軟體開發實習生
簡單題 10個數字位取3個組成乙個三位數 不能重複 使得這三位數的值最大。方法 這個是送分題,我比較懶,直接用set 來存放,然後輸出後面三個位置的值來搞定 奇偶數排序問題 問題描述 一串無序的數字,先根據所以奇數的逆序排序,再輸出所有偶數的順序排序數值。方法 很簡單,基本兩個排序就可以搞定。最大的...