棧的應用之計算機的運算方式

2021-07-26 02:09:16 字數 1993 閱讀 9390

計算機的本質工作就是做數**算,那計算機可以讀入字串「9 + (3 - 1) * 5 + 8 / 2」 並計算值嗎?

計算機只識別2進製,那麼計算機是怎麼進行計算的呢?

答案是通過字尾表示式

關於字尾表示式

波蘭科學家在20世紀50年代提出了一種將運算子放在數字後面的字尾表示式

對應的,我們習慣的數學表示式叫做中綴表示式

例項:5 + 3 = > 5 3 +

1 + 2 * 3 => 1 2 3 * +

9 + (3 -1 ) * 5 => 9 3 1 - 5 * +

中綴表示式符合人們的閱讀和思維習慣,字尾表示式則符合計算機的運算習慣,那麼如何將中綴表示式轉化成字尾表示式呢?

核心**如下

#include #include "linklist.h"

#include "linkstack.h"

int isnumber(char c)

return ret;

}int isoperator(char c)

return ret;

}int isleft(char c)

return ret;

}int isright(char c)

return ret;

}int priority(char c)

if (c == '*' || c == '/') //假設* /的優先順序為2

return ret;

}void output(char c)

}void transform(const char *code)

else if (isleft(code[i])) //對於做括號,直接進棧

else if (isoperator(code[i])) //是符號

linkstack_push(stack,(void *)(int)code[i]); //棧頂符號優先順序低,進棧

} else if (isright(code[i])) //對於右括號,將棧頂符號彈出並輸出,直到匹配左括號

linkstack_pop(stack); //這裡把左括號彈出

} else

i++;

} while (linkstack_size(stack)>0 && code[i] == '\0') //遍歷結束後,棧中若還有元素,全部輸出

linkstack_destroy(stack);

}int main()

將中綴表示式轉化為字尾表示式後,接下來就是如何處理字尾表示式以得到正確的結果了。

其實計算機對字尾表示式的運算是基於棧的

核心**如下:

#include #include "linklist.h"

#include "linkstack.h"

int isnumber(char c)

int isoperation(char c)

int value(char c)

int express(int left, int right, char op)

return ret;

}int computer(const char *exp)

else if (isoperation(exp[i])) //對於符號

else

i++;

} if(linkstack_size(stack) == 1 && exp[i] == '\0')

else

linkstack_destroy(stack);

return ret;

}int main()

輸出結果為:23

計算機組成原理 之 計算機的發展及應用(二)

世界上第一台電子計算機 eniac 1946 現代計算機生產的驅動力 需求 moore 定律 微晶元上整合的電晶體數目每三年翻兩番。各種語言 機器語言 面向機器 組合語言 面向機器 高階語言 面向使用者 問題 系統軟體 語言處理程式 匯程式設計序 編譯程式 解釋程式 作業系統 dos unix wi...

計算機組成原理之計算機的簡化結構

首先,我們開門見山 先來了解模型機的概念 模型機 計算機結構的簡化模型。這樣有利於計算機結構的理解 如圖,我們可以知道 計算機主要由兩個部件和系統匯流排拼成 系統匯流排 如圖 cpu和儲存器之間 1.訪問 記憶體 位址匯流排 位址匯流排決定了cpu可以訪問的實體地址空間 cpu到底使用多大容量的記憶...

計算機系統概論之計算機的工作過程

用計算機解決乙個問題,通常包含兩個過程,乙個是上機前的各種準備,再乙個是上機執行。1.上機前的準備 在許多科學技術的實際問題中,往往會遇到許多複雜的數學方程組,而數字計算機通常只能做加 減 乘 除四則運算,這就要求,在上機前,先由人工完成一些必要的準備工作,這些工作,大致可分為三類 建立數學模型,確...