当前位置: 首页 > news >正文

使用栈结构完成四则运算

使用栈结构完成四则运算


思路:


0.初始化 a.操作栈,b.数字栈 ,定义优先级  +:1 , - : 1 , * : 2 , / : 2

1.如果是数字入数字栈

2.如果是左括号,入操作栈

3.如果右括号:

while(操作栈顶元素 != 左括号){

//----计算过程

num1 = 弹出操作数;

num2 = 弹出操作数;

var op = 弹出操作符;

var r = eval(num2 + op+ num1 );//注意顺序,而不是eval(num1 + op + num2) ,其中,使用了JS中的eval来完成脚本解析和动态执行,这部分不同语言实现会略有不同

计算结果r进入数字栈

//----


}

4.如果是其它操作符 (+-*/) :

a.得到当前优先级 ,得到操作栈栈顶元素优先级

b.如果操作栈空或栈顶元素优先级 < 当前优先级 ,注意是小于,而不是小于等于: 直接入操作栈;

c.否则,,

while(栈顶元素优先级>=当前元素优先级p1){

//--计算过程--

}


while(循环操作栈还有元素){

//--计算过程

}


以下是JS实现:


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扩展函数是为了方便debug定义的。


相关文章:

  • 是妥协?是阴谋?Office 14为何大打“兼容”牌
  • S60智能手机主流输入法横测
  • 背包算法练习--求小于某数字的数组最大和:
  • 诺基亚7610隐藏分区 以及 诺基亚手机秘籍
  • 使用堆实现Top K 算法 JS 实现
  • 无需上传 不必架设FTP 轻松完成文件共享
  • 快速幂算法 - JS 实现
  • Ubuntu 9.04试用过程全接触
  • 算法练习--二分搜索哈希表-JS 实现
  • 网友试用Ubuntu 9.04 Beta版的测评
  • WordPress 被注入 Google Analysis Code 的解决办法
  • MongoDb C# Wrapper 类 (MongoDb Driver 1.9)
  • [Windows编程] 监视DLL装载/卸载
  • 那些开发中用到的模式——访问者模式
  • 浏览器的几个感悟
  • [译] 怎样写一个基础的编译器
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • java概述
  • Markdown 语法简单说明
  • socket.io+express实现聊天室的思考(三)
  • ucore操作系统实验笔记 - 重新理解中断
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 算法-插入排序
  • 由插件封装引出的一丢丢思考
  • - 转 Ext2.0 form使用实例
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​低代码平台的核心价值与优势
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #WEB前端(HTML属性)
  • (Java数据结构)ArrayList
  • (二十四)Flask之flask-session组件
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (简单) HDU 2612 Find a way,BFS。
  • (一)kafka实战——kafka源码编译启动
  • (转)Scala的“=”符号简介
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .axf 转化 .bin文件 的方法
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android]常见的数据传递方式
  • [BZOJ3757] 苹果树
  • [CTO札记]如何测试用户接受度?
  • [C语言]编译和链接
  • [Django开源学习 1]django-vue-admin
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • [office] excel2003进行可视性加密的方法 #媒体#其他#知识分享
  • [Oh My C++ Diary]函数重载
  • [Real world Haskell] 中文翻译:第一章 快速上手