C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
本文實(shí)例為大家分享了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的具體代碼,供大家參考,具體內(nèi)容如下
一、思路:和中綴表達(dá)式的計(jì)算類似,只不過不用計(jì)算,把表達(dá)式輸出即可
1.用字符數(shù)組存儲(chǔ)整行輸入的中綴表達(dá)式;
2.接著從字符數(shù)組的0位置開始判斷字符,如果是數(shù)字,那就要判斷后面是否是數(shù)字,如果是就不斷掃描組成一個(gè)整數(shù)
(暫不考慮負(fù)數(shù)和小數(shù)),最終組成一個(gè)整數(shù),然后輸出這個(gè)數(shù)(因?yàn)椴挥糜?jì)算,所以直接輸出即可);
3.如果是左括號(hào),直接進(jìn)符號(hào)棧;
4.如果是操作運(yùn)算符,與符號(hào)棧的棧頂元素比較優(yōu)先級(jí):如果高就壓入棧;
低,就取出符號(hào)棧頂?shù)脑剌敵觯?/p>
接著,再判斷符號(hào)棧頂?shù)脑睾彤?dāng)前的運(yùn)算符號(hào)繼續(xù)比較優(yōu)先級(jí),重復(fù)前面步驟,直到棧空或者當(dāng)前的符號(hào)優(yōu)先級(jí)高;
5.如果是右括號(hào),把符號(hào)棧棧頂?shù)脑厝〕?,如果不是左括?hào),把取出的運(yùn)算符輸出,接著取符號(hào)棧棧頂?shù)脑?,直到符?hào)棧中取出的符號(hào)是左括號(hào);
6.當(dāng)掃描完字符數(shù)組時(shí),判斷符號(hào)棧是否為空:
不為空,把符號(hào)棧棧頂?shù)脑厝〕?,輸出到窗口,直到符?hào)棧為空。
二、實(shí)現(xiàn)程序:
// 中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
// 操作符:+、-、*、/、%
// 輸入:可以用cin.getline(arr, 250)或者cin.get(ch) && ch != '\n'
// 測(cè)試數(shù)據(jù):輸入格式:(注意:不能有中文的操作符)
// 2+(3+4)*5
// 16+2*30/4
// 輸出格式:
// 2 3 4 + 5 * +
// 16 2 30 * 4 / +
#include <iostream>
#include <stack>
// 判斷是否是操作符
bool isOperator(char ch) {
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false; // 否則返回false
}
// 獲取優(yōu)先級(jí)
int getPriority(char ch) {
int level = 0; // 優(yōu)先級(jí)
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]; // 一個(gè)一個(gè)的讀取表達(dá)式,直到遇到'\0'
std::stack<char> op; // 棧op:存儲(chǔ)操作符
while(1) {
std::cin.getline(arr,250);
int len, i;
char c; // c存儲(chǔ)從棧中取出的操作符
len = (int)strlen(arr); // strlen()輸出的是:unsigned long類型,所以要強(qiáng)制轉(zhuǎn)換為int類型
i = 0;
while(i < len) {
if(isdigit(arr[i])) { // 如果是數(shù)字
num = 0;
do {
num = num * 10 + (arr[i] - '0'); // ch - 48根據(jù)ASCAII碼,字符與數(shù)字之間的轉(zhuǎn)換關(guān)系
i++; // 下一個(gè)字符
}while(isdigit(arr[i]));
std::cout << num << " ";
} else if(arr[i] == '(') { // (:左括號(hào)
op.push(arr[i]);
i++;
} else if(isOperator(arr[i])) { // 操作符
if(op.empty()) {// 如果??眨苯訅喝霔?
op.push(arr[i]);
i++;
}
else {
// 比較棧op頂?shù)牟僮鞣cch的優(yōu)先級(jí)
// 如果ch的優(yōu)先級(jí)高,則直接壓入棧
// 否則,推出棧中的操作符,直到操作符小于ch的優(yōu)先級(jí),或者遇到(,或者棧已空
while(!op.empty()) {
c = op.top();
if(getPriority(arr[i]) <= getPriority(c)) {
// 優(yōu)先級(jí)低或等于
std::cout << c << " ";
op.pop();
} else // ch優(yōu)先級(jí)高于棧中操作符
break;
} // while結(jié)束
op.push(arr[i]); // 防止不斷的推出操作符,最后空棧了;或者ch優(yōu)先級(jí)高了
i++;
} // else
} else if(arr[i] == ')') { // 如果是右括號(hào),一直推出棧中操作符,直到遇到左括號(hào)(
while(op.top() != '(') {
std::cout << op.top() << " ";
op.pop();
}
op.pop(); // 把左括號(hào)(推出棧
i++;
} else // 如果是空白符,就進(jìn)行下一個(gè)字符的處理
i++;
} // 第二個(gè)while結(jié)束
while(!op.empty()) { // 當(dāng)棧不空,繼續(xù)輸出操作符
std::cout << op.top() << " ";
op.pop();
}
std::cout << std::endl;
flush(std::cout);
} // 第一個(gè)while結(jié)束
return 0;
}
運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ 實(shí)現(xiàn)的通訊錄管理系統(tǒng)詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C++中::SHCreateDirectoryEx函數(shù)使用方法
::SHCreateDirectoryEx用于創(chuàng)建多級(jí)目錄,類似于mkdir -p命令,本文主要介紹了C++中::SHCreateDirectoryEx函數(shù)使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
異步http listener 完全并發(fā)處理懲罰http懇求的小例子
異步http listener 完全并發(fā)處理懲罰http懇求的小例子,需要的朋友可以參考一下2013-05-05
Qt串口通信開發(fā)之QSerialPort模塊詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了Qt串口通信開發(fā)之QSerialPort模塊詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03
C語言實(shí)現(xiàn)繪制LoveBeat愛心曲線的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何溧陽C語言實(shí)現(xiàn)繪制LoveBeat愛心曲線,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03
C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Qt利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制
這篇文章主要介紹了Qt如何利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定是參考價(jià)值,需要的可以參考一下2022-06-06

