棧之逆波蘭計算器

2021-08-03 07:34:47 字數 1664 閱讀 8970

逆波蘭表示式又叫做字尾。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於2023年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。

逆波蘭表示式,它的語法規定,表示式必須以逆波蘭表示式的方式給出。逆波蘭表示式又叫做字尾表示式。這個知識點在資料結構和編譯原理這兩門課程中都有介紹,下面是一些例子:

正常的表示式 逆波蘭表示式

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 +

逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如(a+b)*(c+d)轉換為ab+cd+*

它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:

如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。

**如下:

// 逆波蘭式計算器

#include

#include

#include

using namespace std;

#define len 100

// 定義棧結構體

typedef struct _stack

*mystack,node;

// 資料壓棧

void push(mystack *s,double val)

pnew->data = val;

pnew->next = null;

pnew->next = *s;

*s = pnew;

}// 資料出棧

void pop(mystack *s,double *e)

*e = (*s)->data;

mystack npos = (*s);

*s = npos->next;

delete npos;

npos = null;

}// 銷毀棧

void destorystack(mystack *s)

}

// 顯示棧中的資料

void show(mystack s)

}

// 計算器處理函式

void calc(void)

c = getchar();

if (c == ' ')

}

// 進行操作符匹配

switch (c)

else

push(&s, b/ a);

break;

default:

break;

}c = getchar();

}cout << "計算結果是:" << endl;

pop(&s, &a);

cout << a << endl;

}int main(void)

// 例如計算          5-(6+7)*8+9/4

// 逆波蘭表示式      5  6  7 + 8 * - 9 4 / + #

逆波蘭計算器

include include include define stack init size 20 初始化棧的空間 define stackincrement 10 擴充套件空間 define maxbuffer 10 最大緩衝區 typedef double elemtype 建立乙個棧 type...

逆波蘭計算器

1.逆波蘭表示式用途 逆波蘭表示式是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如 a b c d 轉換為ab cd 2.逆波蘭表示式邏輯實現 如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後...

逆波蘭計算器

遍歷表示式。碰到數字將其放到棧中。遇到計算符 從棧中彈出兩個數用計算然後再從新入棧。a 在棧中的最後乙個數即為結果 轉換前 2 9 6 3 5 4轉換後 2963 5 4 使用逆波蘭計算結果為 16.0public class rpncalculator 如果是不是計算符,直接入棧 stack.pu...