計算機的本質工作就是做數**算
,那計算機可以讀
入字串"
1+2+3+4+5+6+7"
並計算值嗎?
答案是肯定的。
這裡我基本實現了個位數的加減乘除,當然這個演算法最簡單的解決方式是採用二叉樹(後面會實現~),這裡作出了棧的實現方式。
首先引入兩個概念:
中綴表示式和字尾表示式
1,在生活中我們通常書寫1+1的時候都會寫成1+1,廢話~,這就是中綴表示式,更符合人們的思維習慣與想法。
2,所謂字尾表示式就是將運算子寫在運算元的後面,這樣更符合計算機的思維。
舉例:5 + 3
=>
5 3 +
1 + 2 * 3
=>
1 23 * +
9 + ( 3 – 1 ) * 5 =>
9 3 1 – 5 * +
為什麼會這樣的呢?我來用我的大白話作一下解釋,比如
9 + ( 3 – 1 ) * 5 =>
9 3 1 – 5 * +
字尾表示式在實現計算的時候,遇到符號就向左尋找運算元,比如上面的9 3 1後面就有 - 號,此時計算機就會將3作為左運算元,1作為右運算元,也就是計算3-1的值,繼續前進,遇到5 pass,遇到*號,就會將剛剛計算好的3-1的值作為左運算元,5作為右運算元,即為(3-1)*5,繼續前進,遇到+號,就會計算9+(3-1)*5的值。就是這樣~
那麼計算機是如何將中綴表示式轉換為字尾表示式和如何將字尾表示式的值求出來的呢?
中綴轉字尾:
遍歷中綴表示式中的數字和符號
對於數字
:直接輸出
對於符號:
->
左括號:進棧
->符號:
與棧頂符號進行優先順序比較
棧頂符號的優先順序低:符號
進棧 棧頂符號的優先順序高
:將棧頂符號彈出並輸出
,之後進棧
->
右括號:
將棧中的所有符號彈出並輸出
計算字尾的值:
遍歷字尾表示式中的數字和符號
對於數字:進棧
對於符號:
->
從棧中彈出右運算元
->
從棧中彈出左運算元
->
根據符號進行運算
->
將運算結果壓入棧中
遍歷結束
:棧中的唯一數字為計算結果
// 棧的應用計算表示式.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #define _crt_secure_no_warnings
#include #include "linkstack.h"
#include //判斷是否為數字
int isnumber(char c)
//判斷是否為操作符
int isoperator(char c)
//判斷是否為:(
int isleft(char c)
//判斷是否為:)
int isright(char c)
//比較優先順序
int priority(char c)
if( (c == '*') || (c == '/') )
return ret;
}//輸出
void output(char c)
}//中綴轉字尾
void transform(const char* exp)
//判斷是否為操作符
else if( isoperator(exp[i]) )
//將當前操作符壓入棧
linkstack_push(stack, (void*)(int)exp[i]);
} //判斷是否為左括號:( ,如果是,則壓入棧
else if( isleft(exp[i]) )
//判斷是否為右括號: )
else if( isright(exp[i]) )
//彈出左括號:(
linkstack_pop(stack);
}else
i++;
}//彈出棧內所有元素
while( (linkstack_size(stack) > 0) && (exp[i] == '\0') )
//銷毀棧
linkstack_destroy(stack); }
int value(char c)
//計算左右運算元的值
int express(int left, int right, char op)
return ret;
}//計算整個表示式的值
int compute(const char* exp)
else if( isoperator(exp[i]) )
else
i++;
}if( (linkstack_size(stack) == 1) && (exp[i] == '\0') )
else
linkstack_destroy(stack);
return ret;
}int _tmain(int argc, _tchar* argv)
執行結果:
8 * 2 + 1 - ( 5 - 1 ) / 2 + 2 - 1中綴轉字尾後結果為:82*1+51-2/-2+1-
8 * 2 + 1 - ( 5 - 1 ) / 2 + 2 - 1 = 16
請按任意鍵繼續. . .
如有錯誤,望不吝指出。
棧的應用 計算字串表示式
1.通過棧來實現字串公式的運算 2.中綴轉字尾 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 符號 與棧頂符號進行優先順序比較 棧頂符號的優先順序低 符號進棧 棧頂符號的優先順序高 將棧頂符號彈出並輸出,之後進棧 右括號 將棧中的所有符號彈出並輸出 3.計算字尾的值 遍歷...
棧的應用 計算表示式
挺久之前寫的乙個作業,acm選修課的,用棧實現的計算表示式,有兩種,一種是將表示式轉換為字尾表示式再計算,一種是直接計算中綴表示式,下面是 1 轉字尾再計算 include includeusing namespace std int main s2.push s i break case case...
棧實現字串表示式計算
最近頻繁解決計算方面的問題,其中就有實現字串表示式計算返回結果值需求,通過使用棧實現,需要定義運算符號優先順序,其它就不細說,如下 csstack.cs using system namespace pyhb 設定棧大最大容量 public void initialize int size 入棧 p...