㈠ 如何用js實現中綴表達式轉後綴表達式然後求值
逆波蘭表達式,它的語法規定,表達式必須以逆波蘭表達式的方式給出。逆波蘭表達式又叫做後綴表達式。這個知識點在數據結構和編譯原理這兩門課程中都有介紹,下面是一些例子:
正常的表達式 逆波蘭表達式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)d ---> a,d,b,c,-,,+
a=1+3 ---> a=1,3 +
http=(smtp+http+telnet)/1024 寫成什麼呢?
http=smtp,http,telnet,+,+,1024,/
逆波蘭表達式是一種十分有用的表達式,它將復雜表達式轉換為可以依靠簡單的操作得到計算結果的表達式。例如(a+b)(c+d)轉換為ab+cd+
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表達式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算符,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表達式掃描完後,棧里的就是結果。
將一個普通的中序表達式轉換為逆波蘭表達式的一般演算法是:
(1)首先構造一個運算符棧,此運算符在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入一個用中綴表示的簡單算術表達式,為方便起見,設該簡單算術表達式的右端多加上了優先順序最低的特殊符號「#」。
(3)從左至右掃描該算術表達式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算符,此時需比較優先關系。
做法如下:將該字元與運算符棧頂的運算符的優先關系相比較。如果,該字元優先關系高於此運算符棧頂的運算符,則將該運算符入棧。倘若不是的話,則將棧頂的運算符從棧中彈出,直到棧頂運算符的優先順序低於當前運算符,將該字元入棧。
(5)重復上述操作(3)-(4)直至掃描完整個簡單算術表達式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表達式轉化為逆波蘭表示的簡單算術表達式。
下面是程序化演算法流程:
1、建立運算符棧stackOperator用於運算符的存儲,壓入'\0'。
2、預處理表達式,正、負號前加0(如果一個加號(減號)出現在最前面或左括弧後面,則該加號(減號)為正負號) 。
3、順序掃描表達式,如果當前字元是數字(優先順序為0的符號),則直接輸出該數字;如果當前字元為運算符或括弧(優先順序不為0的符號),則判斷第4點 。
4、若當前運算符為'(',直接入棧;
若為')',出棧並順序輸出運算符直到遇到第一個'(',遇到的第一個'('出棧但不輸出;
若為其它,比較stackOperator棧頂元素與當前元素的優先順序:
如果 棧頂元素 >= 當前元素,出棧並順序輸出運算符直到 棧頂元素 < 當前元素,然後當前元素入棧;
如果 棧頂元素 < 當前元素,直接入棧。
5、重復第3點直到表達式掃描完畢。
6、順序出棧並輸出運算符直到棧頂元素為'\0'。
各運算符及符號優先順序:
'\0': -1
')': 1
'(': 2
'+'、'-': 3
'*'、'/'、'%': 4
'^': 5
其它: 0
/**
* 計算逆波蘭表達式的值
*/
function calculate(RPolishArray){
var result = 0;
var tempArray = new Array(100);
var tempNum = -1;
for(i = 0;i < RPolishArray.length;i++){
if(RPolishArray[i].match(/\d/)){
tempNum++;
tempArray[tempNum] = RPolishArray[i];
}else{
switch(RPolishArray[i]){
case '+':
result = (tempArray[tempNum-1] *1) + (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '-':
result = (tempArray[tempNum-1] *1) - (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '*':
result = (tempArray[tempNum-1] *1) * (tempArray[tempNum] * 1);
tempNum--;
㈡ 關於javaScript 的好書有哪些
1. 《JavaScript高級程序設計(第3版)》
推薦理由:
ES6是下一代JavaScript語言標準的統稱,每年6月發布一次修訂版,目前已經發布了ES2015、ES2016和ES2017,即將發布ES2018。書中介紹了新版本中新增的語法,對基本概念、設計目的和用法進行了講解,給出了大量示例,適合對JavaScript語言有一定了解的讀者,也可當作新語法的查閱工具。
還有很多其它書籍,這里就不一一贅述了,但不管是什麼書,最終都要落實到動手寫代碼的實處才能在實踐中去檢驗理論,最終轉換為自己能夠吸收的營養。
㈢ JS 注釋過多對項目性能有影響嗎
可能會有影響。
因為嚴格意義上說並不是所有的注釋都能被忽略。
如果你懂得編譯原理的話 你就明白了像下面一段注釋:
/*
*blablabla
*blablabla/ublablabla
*/
如果出現這樣的注釋編譯就不會通過因為注釋里出現了/u這種轉義字元 會被報錯的。
你可以試一下
㈣ 原生JavaScript,怎麼才能學好呢對於我這樣不是計算機專業的來說·
對於你這樣不是計算機專業的來說,壓根就別學javascript,學也寫不好,只會給前端製造麻煩
㈤ 可否談一下Javascript解釋器大致是如何把Javascript源代碼解釋成目標代碼的
。。這個問題就像你問:
可不可以談一下java是怎麼把.java文件編譯成.class以及如何執行.class文件
c++編譯器是如何把c++代碼編譯成可執行文件並讓操作系統執行一樣
。。。
說白了,這就是在問編譯原理。。lz如果真的有興趣倒是可以去看看,我學過一遍全在睡大覺。。
㈥ 寫購物搶秒殺腳本用javascript還是python成功率更高為什麼
一般大型的商業游戲引擎有自己的腳本語言,比如Unreal3就有自己的一套UnrealScript,Unity3d可以用C#、JavaScript~~也有用Python的,不過游戲裡面最知名,用的最多的還是Lua。魔獸世界的腳本語言就是Lua。有些公司自主開發的引擎是不公開的,我們也不知道用什麼,很可能是有自己的一套腳本語言系統,有本書《Gamescriptmastery》就是講解游戲裡面腳本引擎搭建的,如果有興趣,加上一點匯編語言和編譯原理的基礎,可以跟著這本書上的看看。推薦還是用Lua(前面那本書也提到Lua了),這個東西現在比較流行,資料齊全,有問題也方便交流。
㈦ 前端開發需要掌握的技能知識
首先作為前端工程師,掌握前端基礎是最重要的,如果基礎不扎實,一切應用技能就都是「浮雲」。前端的基礎是什麼?HTML、CSS、JavaScript基本功,數學、演算法、數據結構、操作系統、編譯原理基本功。
另外必須要有自己擅長的領域,並且鑽研得足夠深入,同時要有眼界,能「跨界」。可以以前端作為職業,但千萬不要把自己的技能限制在前端領域,因為有很多東西,只有站在前端之外,才能看得更清晰更透徹。想要學習更多技能,建議選擇優就業,優就業的web前端課程有著優秀的講師,科學的課程,建議去實地考察一下,看看實際情況如何。
㈧ 怎麼js理解函數實例
首先我們了解一下對於引用類型變數虛擬機的處理方式:
對於引用類型的變數,虛擬機為其分配內存空間,但在內存空間中存放的並不是變數所引用的對象,而是對象在堆區存放的地址,所以引用變數只是指向被引用那個的對象,而不是存儲了被引用的對象,因而兩個引用變數之間的賦值,實際上九是將一個引用變數存儲的地址復制給另一個引用變數,從而使連個變數指向同一個對象。
好的,我們首先分析第二個例子,為什麼其返回的結果為true
function b(){} 定義了一個函數(也可以理解為一個引用變數);虛擬機為其分配內存空間,內存空間存儲地址加入為「a」;
function a(){return b} 這個就想引用變數b把地址復制給了a,讓a、b指向的內存地址一樣;
a1=a();
a2=a();
兩個賦值,結果自然為true
再看第一個
function a(){return function b(){}}
a1=a();
a2=a();
當賦值的同時 return function b(){} 返回的數據類型一樣,但虛擬機為其分配連個地址,指向不同,所以結果為false;
你可以用typeof()方法測試一下a1、a2以及b function b()的數據類型 你會發現他們的類型都是function,a1/a2的值都是function b(){}但唯一的區別就是內存地址不一樣,引用類型指向不一樣,結果就不一樣。
這些概念的東西,有時候也挺煩人的,但也要慢慢學習,消化這些實際存儲模式。
㈨ 編譯原理中的正則表達式與正規表達式有什麼區別
完全相同,是對regular expression的不同翻譯