数据结构与算法Javascript描述(一)栈

栈的特点: 后入先出。

Stack类:

<span style="white-space:pre">			</span>function Stack() {
				this.dataSource = [];
				this.top = 0;
				this.push = push;
				this.pop = pop;
				this.peek = peek;
				this.clear = clear;
				this.length = length;

			}
			function push(element){
				this.dataSource[this.top++] = element;
			}
			function pop() {
				return this.dataSource[--this.top];
			}
			function peek() {
				return this.dataSource[this.top-1];
			}
			function clear() {
				this.top = 0;
			}
			function length() {
				return this.top;
			}

使用举例:

1、数制间的相互转换(此算法只针对基数为2~9 的情况。)

可以利用栈将一个数字从一种数制转换为另一种数制。例如,将数字n转换为以b为基数的数字,实现如下。

(1)最高位为n%b,将此位压入栈。

(2)使用n/b代替n。

(3)重复步骤1 和2,直到n 等于0,且没有余数。

(4)持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符串形式。

//将一个数转换为指定进制的数
			function mulBase(num, base) {
				var s = new Stack();
				do{
					s.push(num%base);
					num = Math.floor(num/=base);
				}while(num>0)
				var converted = "";
				while(s.length()>0) {
					converted += s.pop();
				}
				return converted;
			}

2、回文

字符串完整压入栈内后,通过持续弹出栈中的每个字母就可以得到一个新字符串,该字符串刚好与原来的字符串顺序相反。我们只需要比较这两个字符串即可,如果它们相等,就是一个回文。

//判断字符串是否为回文
			function isPalindrome(word) {
				var s = new Stack();
				var i,len;
				for(i=0,len = word.length;i<len;i++){
					s.push(word.charAt(i));
				}
				var reverse = "";
				while(s.length()>0) {
					reverse += s.pop();
				}
				if(word === reverse){
					return 1;
				}else {
					return 0;
				}
			}

3、判断一个算术表达式中的括号是否匹配

//判断算术表达式中括号是否匹配
			function isMatch(expression) {
				var s = new Stack(),
				    i = 0,
				    len = expression.length,
				    match = true,
				    chsr = '';
				while(i<len) {
					chsr = expression[i];
					if(chsr === '('){
						s.push(expression[i]);
					}else if(chsr === ')') {
						s.pop();
					}
					i++;
				}
				if(s.length()>0) {
					return false;
				} else {
					return true;
				}
			}

4、将中缀表达式转换为后缀表达式

//将中缀表达式转换为后缀表达式
			function inTopostFix(expression) {
				var order = {'*':1, '/':1,"+":0,"-":0},
					i = 0,
					len = expression.length,
					s = new Stack(),//符号栈
					numStack = new Stack(),//数字栈
					str = '',
					c = '',
					opera = '',
					num = 0,
					curOp = '',
					num1 = 0,
					num2 = 0;
				while(i < len) {
					c = expression.charAt(i);
					if(!isNaN(parseInt(c))) {//当前字符是数字则压入数字栈
						str = str + c + ' ';
						numStack.push(c);
					}else {
						if(c === ')') {//当前字符是‘)’,符号和数字相应的出栈
							while(s.length()&&s.peek() !== '(') {
								curOp = s.pop();
								str += curOp;
								num1 = parseInt(numStack.pop());
								num2 = parseInt(numStack.pop());
								num = operator(num2, num1, curOp);
								numStack.push(num);
							}
							s.pop();
						}else if(c === '(' || c === '+' || c === '-'){
							s.push(c);
						}else  {//当前字符为'*'或'/',则比较栈顶符号与当前符号的优先级
							if(s.length()) {
								opera = s.peek();
								s.push(c);
								str = str + expression.charAt(++i) + ' ';
								numStack.push(expression.charAt(i));
								if(order[opera] < order[s.peek()]) {
									while(s.length()) {
										curOp = s.pop();
										str += curOp;
										num1 = parseFloat(numStack.pop());
										num2 = parseFloat(numStack.pop());
										num = operator(num2, num1, curOp);
										numStack.push(num);
									}
								}
							}else {
								s.push(c);
							}
						}
					}
					i++;
				}
				console.log(num);
				return str;
			}
			function operator(num1, num2, op) {
				var sum = 0;
				switch(op) {
					case '+':
						sum = num1 + num2;
						break;
					case '-':
						sum = num1 - num2;
						break;
					case '*':
						sum = num1 *num2;
						break;
					case '/':
						sum = num1 / num2;
						break;
					default: 
					 	sum = 0;
					 	break;
				}
				return sum;
			}
			console.log(inTopostFix("1+3*2-7/2"));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值