本文实例讲述了JavaScript数据结构中栈的应用之表达式求值问题。分享给大家供大家参考,具体如下:

下面来谈一个比较经典的表达式求值问题,这个问题主要是设计到操作符的优先级。我们通常看到的表达式都是中缀表达式,存在很多优先级差别,而后缀表达式则没有这些优先级问题。下面先看看两种表达式的区别。
中缀表达式:a*b+c*d-e/f
后缀表达式:ab*cd*+ef/-
从中缀表达式转换到后缀表示式是很难实现的,我们这里可以通过栈的思想来实现。下面进行详细的介绍是什么样的思想:
在对一个中缀表示式进行转换的时候,遇到非操作符的字符则直接保存到后缀表示式的存储空间中。
遇到(,则压入栈,只有遇到对应的)才能被弹出。
遇到),就将(之前的操作符全部弹出,并保存到存储空间。
遇到*和/这样优先级高的,就判断栈中的操作符优先级是否低于当前操作符。
如果栈中的遇到的低,则将遇到的继续入栈;如果栈中的高,则将栈中的出栈,遇到的入栈。
最后,当字符串遍历完成,依次弹出操作符,保存到存储空间。
为了方便理解,将上面的例子再次讲解。a*b+c*d-e/f
首先是ab被保存到了存储空间,然后*入栈。现在栈中只有*。
遇到+之后,由于*比+优先级高,所以*出栈,+入栈,这样存储空间变为ab*,栈中变为+。
再时候遇到c,存储空间变为ab*c,栈中还是+。
接下来遇到*和d,由于+比*低,所以*继续入栈,栈中表为了+*,存储空间为ab*cd。
之后遇到-,由于*比-高,所以+*出栈,-入栈,存储空间变为ab*cd*+
……后面不用解释了,悟性再低也应该会了。
下面我们用JavaScript代码来实现下吧。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function midTOLast(a){
var a_len=a.length;
var myArray=new Array();
b='';
for(var i=0;i<a_len;i++){
switch (a[i]){
case '(':
{
myArray.push(a[i]);
break;
}
case ')'://如果是)则将栈中左括号之前的对象弹出
{
if(myArray.length==0){
return false;
}
temp=myArray.pop();//非空,弹出对象
while(temp!='('){//只要不是左括号,则全部弹出
b+=temp;//并输出到后缀表达式中
if(myArray.length==0){//保证栈为空
break;
}
temp=myArray.pop();
}
break;
}
case '*':
case '/':
{
if(myArray.length==0){//如果栈为空则直接入栈
myArray.push(a[i]);
}else{
temp=myArray[myArray.length-1];
if(temp=='+'||temp=='-'){//如果遇到高的,则遇到的继续入栈
myArray.push(a[i]);//遇到的入栈
}
}
break;
}
case '+':
case '-':
{
if(myArray.length==0){//如果栈为空则直接入栈
myArray.push(a[i]);
}else{
temp=myArray[myArray.length-1];
if(temp=='/'||temp=='*'){//如果遇到低的,则栈中的出栈,遇到的入栈
while(myArray.length!=0){
temp=myArray.pop();//栈中的出栈
b+=temp;//保存到存储空间
}
myArray.push(a[i]);//遇到的入栈
}
}
break;
}
default:
{
b+=a[i];
break;
}
}
}
//最后将栈中剩下的操作符输出
while(myArray.length!=0){
temp=myArray.pop();
b+=temp;
}
return true;
}
var x="a*b+c*d-e/f";
midTOLast(x);
alert(b);//ab*cd*+ef/-
</script>
</body>
</html>
当然,以上程序还存在一点bug,但是思想应该就是这样子的。
下面,我们将讲解如何通过后缀表达式计算出表达式的结果。
那么,我们将中缀表达式转化为后缀表达式后,如何继续计算呢?还是以这个例子为例。
中缀表达式:a*b+c*d-e/f
后缀表达式:ab*cd*+ef/-
基本思路如下:
遍历后缀表达式,遇到非操作符的字符则直接进栈,遇到操作符则出栈两个元素,进行对应操作,然后将得到的结果再次入栈。依次直到遍历完成,此处栈中保存的值就是当前表达式的值。
实现的JavaScript代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function getValue(a){
var a_len=a.length,
myArray=new Array();
for(var i=0;i<a_len;i++){
switch (a[i])
{//遇到数值则直接入栈
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
myArray.push(a[i]);
break;
}
case '+':
{//遇到操作符则出栈两个元素进行对应操作
temp=myArray.pop()+myArray.pop();
myArray.push(temp);//再将结果入栈
temp=null;
break;
}
case '-':
{
s=myArray.pop();
temp=myArray.pop()-s;
myArray.push(temp);
s=null;temp=null;
break;
}
case '*':
{
temp=myArray.pop()*myArray.pop();
myArray.push(temp);//再将结果入栈
temp=null;
break;
}
case '/':
{
s=myArray.pop();
temp=myArray.pop()/s;
myArray.push(temp);
s=null;temp=null;
break;
}
}
}
return myArray.pop();//算出结果
}
var a="12*34*+36/-";//1*2+3*4-3/6
var b=getValue(a);//13.5
alert(b);
</script>
</body>
</html>
好啦,栈的应用场景还有很多,比如进制的转换,行编辑程序,迷宫求解等。这里就不一一介绍了。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
# JavaScript
# 数据结构
# 栈
# 应用
# 表达式求值
# C语言中栈和队列实现表达式求值的实例
# 浅谈C/C++ 语言中的表达式求值
# C++利用链栈实现表达式求值
# C++表达式求值详解
# 弹出
# 遍历
# 则将
# 为空
# 直接入
# 来实现
# 再将
# 都是
# 相关内容
# 很难
# 求值
# 两种
# 这个问题
# 感兴趣
# 可以通过
# 给大家
# 为例
# 在对
# 就将
相关文章:
如何快速搭建高效服务器建站系统?
,南京靠谱的征婚网站?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
制作宣传网站的软件,小红书可以宣传网站吗?
TestNG的testng.xml配置文件怎么写
如何安全更换建站之星模板并保留数据?
建站为何优先选择香港服务器?
建站主机功能解析:服务器选择与快速搭建指南
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何在Windows 2008云服务器安全搭建网站?
如何快速搭建高效WAP手机网站吸引移动用户?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
上海网站制作开发公司,上海买房比较好的网站有哪些?
IOS倒计时设置UIButton标题title的抖动问题
寿县云建站:智能SEO优化与多行业模板快速上线指南
学校为何禁止电信移动建设网站?
常州企业网站制作公司,全国继续教育网怎么登录?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
如何在建站之星绑定自定义域名?
如何用景安虚拟主机手机版绑定域名建站?
平台云上自助建站如何快速打造专业网站?
如何正确选择百度移动适配建站域名?
如何用好域名打造高点击率的自主建站?
如何在阿里云完成域名注册与建站?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何配置WinSCP新建站点的密钥验证步骤?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何用花生壳三步快速搭建专属网站?
制作网站外包平台,自动化接单网站有哪些?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
定制建站策划方案_专业建站与网站建设方案一站式指南
制作电商网页,电商供应链怎么做?
如何快速生成橙子建站落地页链接?
建站之星导航菜单设置与功能模块配置全攻略
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在景安服务器上快速搭建个人网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何通过FTP空间快速搭建安全高效网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
免费视频制作网站,更新又快又好的免费电影网站?
招商网站制作流程,网站招商广告语?
如何用y主机助手快速搭建网站?
如何在云主机快速搭建网站站点?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何高效利用亚马逊云主机搭建企业网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。