逆波蘭表示式的c++實現
一、問題描述;
1、逆波蘭表示式簡介;
逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如(a+b)*(c+d)轉換為ab+cd+*
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
2、逆波蘭表示式的示例;
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
二、**:
//逆波蘭表示式
#include using namespace std;
const int length = 1000; //棧的最大長度
typedef struct stack
stack;
stack * creatstack(); //建立
void push(stack * s, char x); //壓棧操作
char pop(stack * s); //出棧操作
void operate(char * str); //轉換函式
bool isempty(stack * s); //判斷棧是否為空
bool isfull(stack * s); //判斷棧是否為滿
int main()
stack * creatstack() //建立並初始化(top = -1)
head->a = (char *)malloc(sizeof(char) * length);
if (!head->a)
head->top = -1;
return head;
}void push(stack * s, char x) //壓棧操作
else exit(0);
} char pop(stack * s) //出棧操作
else exit(0);
}void operate(char * str) //轉換函式
pop(s1);
break;
case'+':
case'-':
if (s1->a[s1->top] == '(' || s1->a[s1->top] == '#')
else
break;
case'*':
case'/':
if (s1->a[s1->top] == '*' || s1->a[s1->top] == '/')
else
break;
default: //數字直接入棧
push(s2, str[i]);
break;
} }while (s1->top)
for (i = 0; i <= s2->top; i++)
cout << endl;}}
bool isempty(stack * s) //判斷棧是否為空
return flag;
}bool isfull(stack * s) //判斷棧是否為滿
return flag;
}
三、總結;
由於最近剛接觸到棧,只是知道它的一些特點,但到真正使用時卻覺得特別的生澀。於是,我便開始查閱資料認真的學習資料上的思想,但是,當我真正寫出這段**之後,覺得其實真的挺簡單的。話不多說,上面的**是可以執行的,但我希望讀者能更加注重注釋,而不是僅對**的複製貼上。
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
波蘭逆波蘭表示式
實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...
波蘭表示式與逆波蘭表示式
2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...