假如給定乙個中綴表示式:1+(2-3)*4+10/5利用棧就可以匯出字尾表示式123-4*+105/+
當得到乙個字尾表示式時就很容易的求出表示式的值了,也是用棧計算的,對於123-4*+105/+,從前往後,如果遇到運算元的時候直接入棧,遇到操作符,就從棧中彈出兩個操作,那下面的跟上面的那個預算,就可以得到123-4*+105/+的值為-1了,張銘的資料結構堆疊中講的有。
下面是個中綴表示式的例子:
stack.h
#include #include //棧節點資料結構
class doublenode
};
//棧,用來儲存採用字尾表示式進行四則運算時的運算元
class doublestack
~doublestack();
void push(double value);
double pop();
bool isempty()
double gettop();
};
//棧節點資料結構
class charnode
};
//棧,用來儲存中綴表示式轉換成字尾表示式時的運算子
class charstack
~charstack();
void push(char value);
char pop();
bool isempty()
char gettop();
void makeempty();
};
stack.cpp
#include "stack.h"
doublestack::~doublestack()
}void doublestack::push(double value)
double doublestack::pop()
}double doublestack::gettop()
charstack::~charstack()
}void charstack::push(char value)
char charstack::pop()
}void charstack::makeempty()
}char charstack::gettop()
arithmetic.h
#include #include #include #include #include "stack.h"
class data
; class arithmetic
;
arithmetic.cpp
#include "arithmetic.h"
void arithmetic::midtopost(char *c)
cstack.push(c[k]);
} else if (c[k] == ')')
} }
else if (c[k] == '#')
} else if (c[k] >= '0' && c[k] <= '9')
post[i].num = atof(num);
post[i].op = '#';
i++;
k--;
} else
k++;
} curlen = i;
} //棧內優先順序,棧內優先順序大於棧外優先順序
//'('的棧內優先順序應該比所有的操作符都小(除了#)
//')'的棧內優先順序應該最大
//+-的優先順序一致,*/的優先順序一致
int arithmetic::isp(char op)
return pri;
} //棧外優先順序
int arithmetic::icp(char op)
return pri;
} //根據字尾表示式進行四則運算
double arithmetic::calculate()
else //如果是操作符,就取出兩個數字進行運算
} }
return dstack.pop();
}
main.cpp
#include "arithmetic.h"
int main()
逆波蘭計算器 中綴表示式轉字尾表示式
1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...
簡單計算器 中綴表示式轉字尾表示式 求值
命題人 外部匯入 時間限制 1.000 sec 記憶體限制 32 mb 解決 1817 提交 4382統計 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一...
表示式計算器
早在上大學的時候,就想編寫乙個可以計算數學表示式的計算器,因為windowsxp自帶的計算器不支援表示式輸入,當要計算乙個算式時,不太方便。表示式計算器看似簡單,但要想把它做完善,不太容易,經過幾次改進之後,於一年前完成了這個小程式,雖然可能會有一些不足,不過也不打算再投入時間了,價值不大,只是拿來...