最近在学习算法和数据结构,直接上代码;
先看一下在学习中的截屏参考下
栈的特性,这个图很形象;
先用js中的数组模拟实现一下:
// 栈是先今后出(后进先出原则)
//用数组模拟一个栈,实现stack类
function Stack() {
var items = [];//存储数据
//从栈顶添加元素,也叫压栈
this.push = function (item) {
items.push(item);
};
//弹出栈顶元素
this.pop = function () {
return items.pop();
};
//返回栈顶元素
this.top = function () {
return items[items.length - 1];
};
//判断栈是否为空
this.isEmpty = function () {
return items.length == 0;
};
//看栈的大小
this.size = function () {
return items.length
};
//清空栈
this.clear = function () {
items = [];
}
};
实现好了以后就去实现一个逆波兰表达式:编写函数calc_exp(exp)实现逆波兰表达式计算,exp的类型是数组;
思路:
使用for循环遍历数组,对每一个元素做如下操作 :
1.如果元素不是+,-,,/中的某一个,就压入栈中;
2.如果元素是+,-,,/中的某一个,就从栈中连续弹出两个元素,并对这两个元素进行计算,将计算结果 压入栈中;
for循环结束之后,栈里只有一个元素,这个元素就是整个表达式的计算结果;
//也叫计算后缀表达式
function cal_exp(exp){
var stack=new Stack();
for(var i =0;i<exp.length;i++){
var item =exp[i];
if (["+","-","*","/"].indexOf(item)>=0) {
var value1=stack.pop();
var value2=stack.pop();
//第一次弹出的数据放在运算符的右边,第二个弹出来的数放在运算符的左边
var exp_str=value2+item+value1;
//计算取整
var res=parseInt(eval(exp_str));
//计算结果压入栈中
stack.push(res.toString());
} else {
stack.push(item);
}
}
return stack.pop()
};
console.log('cale_exp',cal_exp(['4','13','5','/','+']));//6
先这样简单的实现:但是碰到计算优先级,怎么把中缀表达式转成后缀表达式,还在学习中,弄懂以后回来补充;谢谢阅读