摘要:下面我們用棧來(lái)實(shí)現(xiàn)簡(jiǎn)易的四則運(yùn)算計(jì)算器。列一下本文的思路實(shí)現(xiàn)鏈棧的數(shù)據(jù)結(jié)構(gòu)及其操作中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式后綴表達(dá)式求值首先先實(shí)現(xiàn)一個(gè)鏈棧。是否是四則運(yùn)算符號(hào)計(jì)算后綴表達(dá)式的值為空則跳過(guò)最后,我們測(cè)試一下所實(shí)現(xiàn)的計(jì)算器。
棧是一種限定僅在表尾進(jìn)行插入和刪除操作的線性表。棧的應(yīng)用有很多,比如常見(jiàn)的遞歸,計(jì)算機(jī)表達(dá)式求值等。下面我們用棧來(lái)實(shí)現(xiàn)簡(jiǎn)易的四則運(yùn)算計(jì)算器。
列一下本文的思路:
實(shí)現(xiàn)鏈棧的數(shù)據(jù)結(jié)構(gòu)及其操作
中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
后綴表達(dá)式求值
//定義棧的數(shù)據(jù)結(jié)構(gòu) class Node { public $symbol; public $next; public function __construct( $symbol, $next ) { $this->symbol = $symbol; $this->next = $next; } } //初始化棧,生成頭結(jié)點(diǎn) function initStack( &$node ) { $node = new Node( "", null ); } //入棧 function push( Node &$node, $symbol ) { $p = new Node( $symbol, null ); $p->next = $node->next; $node->next = $p; } //出棧 function pop( Node &$node, &$symbol ) { if ( null == $node->next ) { echo "???"; return; } $q = $node->next; $symbol = $q->symbol; $node->next = $node->next->next; unset( $q ); }
//獲取運(yùn)算符的優(yōu)先級(jí) function get_priority( $symbol ) { switch ( $symbol ) { case "(": $priority = 3; break; case "*": case "/": $priority = 2; break; case "+": case "-": $priority = 1; break; case ")": $priority = 0; break; default: $priority = 0; break; } return $priority; } //棧頂依次出棧,如果遇到"("則停止 function clear_stack( &$list ) { $res = ""; while ( null != $list->next ) { if ( "(" != $list->next->symbol ) { pop( $list, $item ); $res .= $item; } else { pop( $list, $item ); return $res; } } return $res; } //中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式 function middle_to_back( $middle_expression ) { initStack( $list ); $back_expression = ""; $length = strlen( $middle_expression ); for ( $i = 0; $i < $length; $i ++ ) { $symbol = $middle_expression[ $i ]; if ( " " != $symbol ) { if ( is_numeric( $symbol ) ) { //數(shù)字直接輸出 $back_expression .= $symbol; } else {//非數(shù)字則比較優(yōu)先級(jí) $stack_top_priority = get_priority( null == $list->next ? "" : $list->next->symbol ); $current_symbol_priority = get_priority( $symbol ); if ( $current_symbol_priority > $stack_top_priority ) {//優(yōu)先級(jí)比棧頂高則進(jìn)棧 push( $list, $symbol ); } else { $output = clear_stack( $list ); $back_expression .= $output; if ( ")" != $symbol ) { push( $list, $symbol ); } } } } } while ( null != $list->next ) {//將棧清空 pop( $list, $item ); $back_expression .= $item; } return $back_expression; }
//是否是四則運(yùn)算符號(hào) function is_arithmetic_symbol( $symbol ) { $arithmetic_symbols = array( "+", "-", "*", "/" ); if ( in_array( $symbol, $arithmetic_symbols ) ) { return true; } else { return false; } } //計(jì)算后綴表達(dá)式的值 function calculate( $expression ) { $stack = new Node( "", null ); $length = strlen( $expression ); for ( $i = 0; $i < $length; $i ++ ) { if ( " " != $expression[ $i ] ) {//為空則跳過(guò) if ( is_numeric( $expression[ $i ] ) ) { push( $stack, $expression[ $i ] ); } else if ( is_arithmetic_symbol( $expression[ $i ] ) ) { pop( $stack, $n1 ); pop( $stack, $n2 ); $res = get_result( $n2, $n1, $expression[ $i ] ); push( $stack, $res ); } else { echo "wrong symbol, exit"; exit(); } } } $value = $stack->next->symbol; return $value; }
function main() { $back_expression = middle_to_back( "((1+2)*3-4) * 5" ); $result = calculate( $back_expression ); echo "后綴表達(dá)式的值為: " . $back_expression, PHP_EOL; echo "result : " . $result, PHP_EOL; } main();
得到的結(jié)果如下:
簡(jiǎn)易的計(jì)算器就實(shí)現(xiàn)啦!~~~
(代碼中有一些細(xì)節(jié)未做判斷,希望讀者理解。歡迎大家提出批評(píng)修改意見(jiàn),感謝~)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29988.html
摘要:采用鏈地址法來(lái)處理沖突這個(gè)就被賦值到里面去了。的應(yīng)用非常廣泛,是新框架中用來(lái)代替的類,也就是說(shuō)建議使用,不要使用的方法是同步的,未經(jīng)同步直接使用對(duì)象的中數(shù)組默認(rèn)大小是,增加的方式是。中數(shù)組的默認(rèn)大小是,而且一定是的指數(shù) Hashmap采用鏈地址法來(lái)處理沖突: void addEntry(int hash, K key, V value, int bucketIndex) { ...
摘要:棧底是固定的,而棧頂浮動(dòng)的如果棧中元素個(gè)數(shù)為零則被稱為空棧。入棧將數(shù)據(jù)保存到棧頂。鏈棧鏈棧是指棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),是沒(méi)有附加頭節(jié)點(diǎn)的運(yùn)算受限的單鏈表,棧頂指針是鏈表的頭指針。 一、喜歡單挑線性表 1.線性表的特性 線性表是一個(gè)線性結(jié)構(gòu),它是一個(gè)含有n≥0個(gè)節(jié)點(diǎn)的有限序列。在節(jié)點(diǎn)中,有且僅有一個(gè)開(kāi)始節(jié)點(diǎn)沒(méi)有前驅(qū)并有一個(gè)后繼節(jié)點(diǎn),有且僅有一個(gè)終端節(jié)點(diǎn)沒(méi)有后繼并有一個(gè)前驅(qū)節(jié)點(diǎn)。其他的節(jié)點(diǎn)都有且...
摘要:注意當(dāng)多個(gè)父接口中存在相同的默認(rèn)方法時(shí),子類中以就近原則繼承。定義靜態(tài)默認(rèn)方法這是版簡(jiǎn)易計(jì)算器接口默認(rèn)方法使用定義接口并提供默認(rèn)打印方法定義接口默認(rèn)方法支持方法形參這是數(shù)值運(yùn)算基本接口。。。 總概 JAVA8 已經(jīng)發(fā)布很久,而且毫無(wú)疑問(wèn),java8是自java5(2004年發(fā)布)之后的最重要的版本。其中包括語(yǔ)言、編譯器、庫(kù)、工具和JVM等諸多方面的新特性。 Java8 新特性列表如下:...
閱讀 2596·2021-11-24 09:39
閱讀 3595·2019-08-30 15:53
閱讀 690·2019-08-29 15:15
閱讀 2995·2019-08-26 13:23
閱讀 3347·2019-08-26 10:48
閱讀 732·2019-08-26 10:31
閱讀 880·2019-08-26 10:30
閱讀 2442·2019-08-23 18:32