新聞中心
本篇文章重點為大家分享一下C++中綴表達式轉(zhuǎn)后綴表達式具體實現(xiàn)方法,有需要的小伙伴可以參考一下。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),沁陽企業(yè)網(wǎng)站建設(shè),沁陽品牌網(wǎng)站建設(shè),網(wǎng)站定制,沁陽網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,沁陽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
一、思路:和中綴表達式的計算類似,只不過不用計算,把表達式輸出即可
1.用字符數(shù)組存儲整行輸入的中綴表達式;
2.接著從字符數(shù)組的0位置開始判斷字符,如果是數(shù)字,那就要判斷后面是否是數(shù)字,如果是就不斷掃描組成一個整數(shù)
(暫不考慮負數(shù)和小數(shù)),最終組成一個整數(shù),然后輸出這個數(shù)(因為不用計算,所以直接輸出即可);
3.如果是左括號,直接進符號棧;
4.如果是操作運算符,與符號棧的棧頂元素比較優(yōu)先級:如果高就壓入棧;
低,就取出符號棧頂?shù)脑剌敵觯?/p>
接著,再判斷符號棧頂?shù)脑睾彤斍暗倪\算符號繼續(xù)比較優(yōu)先級,重復前面步驟,直到??栈蛘弋斍暗姆杻?yōu)先級高;
5.如果是右括號,把符號棧棧頂?shù)脑厝〕?,如果不是左括號,把取出的運算符輸出,接著取符號棧棧頂?shù)脑?,直到符號棧中取出的符號是左括號?/p>
6.當掃描完字符數(shù)組時,判斷符號棧是否為空:
不為空,把符號棧棧頂?shù)脑厝〕?,輸出到窗口,直到符號棧為空?/p>
二、實現(xiàn)程序:
// 中綴表達式轉(zhuǎn)后綴表達式
// 操作符:+、-、*、/、%
// 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'
// 測試數(shù)據(jù):輸入格式:(注意:不能有中文的操作符)
// 2+(3+4)*5
// 16+2*30/4
// 輸出格式:
// 2 3 4 + 5 * +
// 16 2 30 * 4 / +
#include
#include
// 判斷是否是操作符
bool isOperator(char ch) {
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false; // 否則返回false
}
// 獲取優(yōu)先級
int getPriority(char ch) {
int level = 0; // 優(yōu)先級
switch(ch) {
case '(':
level = 1;
break;
case '+':
case '-':
level = 2;
break;
case '*':
case '/':
level = 3;
break;
default:
break;
}
return level;
}
int main(int argc, const char * argv[]) {
// insert code here...
int num;
char arr[250]; // 一個一個的讀取表達式,直到遇到'\0'
std::stack op; // 棧op:存儲操作符
while(1) {
std::cin.getline(arr,250);
int len, i;
char c; // c存儲從棧中取出的操作符
len = (int)strlen(arr); // strlen()輸出的是:unsigned long類型,所以要強制轉(zhuǎn)換為int類型
i = 0;
while(i if(isdigit(arr[i])) { // 如果是數(shù)字
num = 0;
do {
num = num * 10 + (arr[i] - '0'); // ch - 48根據(jù)ASCAII碼,字符與數(shù)字之間的轉(zhuǎn)換關(guān)系
i++; // 下一個字符
}while(isdigit(arr[i]));
std::cout " ";
} else if(arr[i] == '(') { // (:左括號
op.push(arr[i]);
i++;
} else if(isOperator(arr[i])) { // 操作符
if(op.empty()) {// 如果???,直接壓入棧
op.push(arr[i]);
i++;
}
else {
// 比較棧op頂?shù)牟僮鞣cch的優(yōu)先級
// 如果ch的優(yōu)先級高,則直接壓入棧
// 否則,推出棧中的操作符,直到操作符小于ch的優(yōu)先級,或者遇到(,或者棧已空
while(!op.empty()) {
c = op.top();
if(getPriority(arr[i]) " ";
op.pop();
} else // ch優(yōu)先級高于棧中操作符
break;
} // while結(jié)束
op.push(arr[i]); // 防止不斷的推出操作符,最后空棧了;或者ch優(yōu)先級高了
i++;
} // else
} else if(arr[i] == ')') { // 如果是右括號,一直推出棧中操作符,直到遇到左括號(
while(op.top() != '(') {
std::cout " ";
op.pop();
}
op.pop(); // 把左括號(推出棧
i++;
} else // 如果是空白符,就進行下一個字符的處理
i++;
} // 第二個while結(jié)束
while(!op.empty()) { // 當棧不空,繼續(xù)輸出操作符
std::cout " ";
op.pop();
}
std::cout while結(jié)束
return 0;
}
運行結(jié)果:
分享名稱:C++中綴表達式轉(zhuǎn)后綴表達式具體實現(xiàn)方法
本文來源:http://www.5511xx.com/article/dhjcdio.html


咨詢
建站咨詢
