日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用栈结构完毕四则运算

發(fā)布時間:2025/6/16 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用栈结构完毕四则运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用棧結(jié)構(gòu)完畢四則運算


思路:


0.初始化 a.操作棧,b.數(shù)字棧 ,定義優(yōu)先級 ?+:1 , - : 1 , * : 2 , / : 2

1.假設(shè)是數(shù)字入數(shù)字棧

2.假設(shè)是左括號,入操作棧

3.假設(shè)右括號:

while(操作棧頂元素 != 左括號){

//----計算過程

num1 = 彈出操作數(shù);

num2 = 彈出操作數(shù);

var op = 彈出操作符;

var r = eval(num2 + op+ num1 );//注意順序。而不是eval(num1 + op + num2) ,當(dāng)中,使用了JS中的eval來完畢腳本解析和動態(tài)運行。這部分不同語言實現(xiàn)會略有不同

計算結(jié)果r進入數(shù)字棧

//----


}

4.假設(shè)是其他操作符 (+-*/) :

a.得到當(dāng)前優(yōu)先級 ,得到操作棧棧頂元素優(yōu)先級

b.假設(shè)操作棧空或棧頂元素優(yōu)先級?< 當(dāng)前優(yōu)先級?,注意是小于,而不是小于等于: 直接入操作棧;

c.否則,。

while(棧頂元素優(yōu)先級>=當(dāng)前元素優(yōu)先級p1){

//--計算過程--

}


while(循環(huán)操作棧還有元素){

//--計算過程

}


下面是JS實現(xiàn):


Array.prototype.select = function (f){ var arr = new Array(); for(var i = 0;i < this.length;i++){ arr.push(f(this[i])); } return arr; };var op = [{k:'+',w:1},{k:'-',w:1},{k:'*',w:2},{k:'/',w:2},{k:'(',w:0.5},{k:')'}]var opIndex = function(c){ for(var j = 0; j < op.length; j++){ if(op[j].k == c){return j;} } return -1; }var isNum = function(c){ return parseInt(c) == c; }function p(str){var retArr = new Array(); var numStr = ""; for(var i = 0;i < str.length;i++){ if(str[i] == ' '){continue;} else if(isNum(str[i])){ numStr += str[i]; if(i == str.length - 1){ retArr.push(numStr); break; } } else if(opIndex(str[i]) > -1 ){if(numStr != ""){ retArr.push(numStr); } retArr.push(str[i]); numStr = "";} else{ console.log("error : unexpected char " + str[i] + ", only [0-9] and [+-*/()] is supported"); return null; }}return retArr; }function c(arr){ var ret = new Array(); var opArr = new Array();var calc = function(){ var num1 = ret.pop(); var num2 = ret.pop(); var opr = opArr.pop(); ret.push(eval('('+num2+')'+opr.k+'('+num1+')')); }for(var i = 0;i < arr.length; i++){ if(isNum(arr[i])){ ret.push(arr[i]); continue; } if(arr[i] == '('){ opArr.push({k:'(',w:0.5}); continue; } if(arr[i] == ')'){ for(;opArr[opArr.length-1].k!='(';){ calc(); } opArr.pop();continue; }var index = opIndex(arr[i]); var weight = op[index].w;if(opArr.length == 0 || opArr[opArr.length-1].w < weight /*note , should not '<=' */){ opArr.push({k:arr[i],w:weight}); } else{ for(;opArr.length > 0 && opArr[opArr.length-1].w >= weight;){ calc(); } opArr.push({k:arr[i],w:weight}); }}for(;opArr.length > 0;){ calc(); }return ret; }var arr = p("5-4+6*(7-10)"); console.log(c(arr));

注:代碼中的Array.prototype.select擴展函數(shù)是為了方便debug定義的。









本文轉(zhuǎn)自mfrbuaa博客園博客,原文鏈接:http://www.cnblogs.com/mfrbuaa/p/5093441.html,如需轉(zhuǎn)載請自行聯(lián)系原作者


總結(jié)

以上是生活随笔為你收集整理的使用栈结构完毕四则运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。