数据结构:用JS实现栈

397 阅读2分钟

首先,我们先介绍一下数据结构栈的一些特点。 栈是一种遵从先进后出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端就叫做栈底。 接下来,就是用JavaScript来完成栈的实现。

创建一个类来表示栈。

function Stack () {} //先声明这个类

接下来,我们需要一种数据结构来保存栈里的元素。这里选择数组来保存栈里的元素,方便下面实现栈内部方法。

var items = [];

当然,我们还需要为这个栈声明一些方法。

  • push(element):添加一个新元素到栈顶。
  • pop():移除栈顶的元素,同时返回被移除的元素。
  • peek():返回栈顶的元素,不对栈做任何修改。
  • isEmpty():如果栈里没有任何元素就返回true,否则返回false。
  • clear():移除栈里的所有元素。
  • size():返回栈里的元素个数。
function Stack () {
	var items = [];
	//添加的新元素只能出现在栈顶
	this.push = function (element) {
		items.push(element);
	};
	//先进后出,所以移除的是最后添加进去的元素
	this.pop = function () {
		return items.pop();
	};
	//返回栈顶的元素
	this.peek = function () {
		return items[items.length - 1];
	};
	//判断栈是否为空
	this.isEmpty = function () {
		return items.length == 0;
	};
	//返回栈的长度
	this.size = function () {
		return items.length;
	};
	//清除整栈
	this.clear = function () {
		items = [];
	};
	//输出栈内元素
	this.print = function () {
		console.log( items.toString() );
	}
}

到这,我们会创建了一个栈。

下面,我再给大家介绍一个基于栈的一个算法

进制转换算法

首先,我们先来试试从十进制到二进制

function divideBy2 (decNumber) {
	var remStack = new Stack(),
		rem,
		binaryString = "";
	
	while (decNumber > 0) {
		rem = Math.floor(decNumber % 2);
		remStack.push(rem);
		decNumber = Math.floor(decNumber / 2);
	}

	while (!remStack.isEmpty()) {
		binaryString += remStack.pop().toString();
	}
	retuan binaryString;
}

我们拿10来走一遍程序是这样的 10 / 2 = 5 ->0 5 / 2 = 2 ->1 2 / 2 = 1 ->0 1 / 2 = 0.5 ->1 这时,栈里元素顺序和上面一样,输出时遵循先进后出原则为1010

然后我们把这个算法修改一下:从十进制到十六进制以内进制

function baseConverter (decNumber, base) {
	var remStack = new Stack(),
		rem,
		baseString = "",
		digits = "0123456789ABCDEF";
	
	while (decNumber > 0) {
		rem = Math.floor(decNumber % base);
		remStack.push(rem);
		decNumber = Math.floor(decNumber / base);
	}

	while (!remStack.isEmpty()) {
		baseString += digits[remStack.pop()];
	}
	retuan baseString;
}

这里只将进制控制在十六进制以内,余数是0到9之间的数字加上A(10)、B(11)、C(12)、D(13)、E(14)、F(15)。 我们通过digits字符串和栈内添加余数对应关系来实现。

同样,我们拿100345转换为十六进制来走一下程序: 100345 / 16 = 6271 ->9 6271 / 16 = 391 ->15 391 / 16 = 24 ->7 24 / 16 = 1 ->8 1 / 16 = 0 ->1 digits[9] = 9 digits[15]= F digits[7] = 7 digits[8] = 8 digits[1] = 1 ->187F9

吼吼,栈就先到在这里了