1.数据结构定义
在计算机中,存储和组织数据的方式。
注:数据结构与语言无关。
1.1常见的数据结构:
数组(Aarray)栈(Stack)链表(Linked List)图(Graph)散列表(Hash)队列(Queue)树(Tree)堆(Heap)
2.算法(Algorithm)
- ? 一个有限指令集,每条指令的描述不依赖于语言
- 接受一些输入(有些情况下不需要输入)
- 产生输出
- 一定在有限步骤之后终止
注:数据结构的实现,离不开算法。
3.栈结构(Stack)—后进先出(LIFO)
是一种受限的线性表,仅允许在表的一端进行插入和删除运算。
? 在生活中也能发现很多栈的例子。例如,厨房里堆放的盘子,总是叠在上方的先被使用;输入框内容进行删除时,总是最后输入的先删除;弹夹中的子弹,越后装入的,越先发射…
4.实现栈结构
基于数组实现/基于链表实现
5.常见栈操作
首先创建一个类来表示栈
function Stack () { }
我们需要选择一种数据结构来保存栈里的元素,可以选择数组
function Stack(){
var items = []
}
然后给栈添加一些方法:
push(element):添加一个新元素到栈顶位置
Stack.prototype.push = function(element){
? this.items.push(element)
? }
pop():移除栈顶元素,同时返回被移除的元素
Stack.prototype.pop = function(){
? return this.items.pop()
? }
peek():返回栈顶元素,不对栈做任何修改(这个方法不会移除栈顶元素,仅仅返回它)
Stack.prototype.peek = function(){
? return this.items[this.items.length - 1]
? }
isEmpty():如果栈里没有任何元素就返回true,否则返回false
Stack.prototype.isEmpty = function(){
? return this.items.length == 0
? }
size():返回栈里的元素个数,这个方法和数组的length属性很类似
Stack.prototype.size = function(){
? return this.items.length
? }
toString():将栈结构的内容以字符形式返回
Stack.prototype.toString = function(){
? var resultSrting = ''
? for(var i = 0;i <= this.items.length;i++){
? resultSrting += this.items[i]+' '
? }
? return resultSrting
? }
栈的完整代码:
? function Stack(){
?
? this.items = []
?
?
? Stack.prototype.push = function(element){
? this.items.push(element)
? }
?
? Stack.prototype.pop = function(){
? return this.items.pop()
? }
?
? Stack.prototype.peek = function(){
? return this.items[this.items.length - 1]
? }
?
? Stack.prototype.isEmpty = function(){
? return this.items.length == 0
? }
?
? Stack.prototype.size = function(){
? return this.items.length
? }
?
? Stack.prototype.toString = function(){
? var resultSrting = ''
? for(var i = 0;i <= this.items.length;i++){
? resultSrting += this.items[i]+' '
? }
? return resultSrting
? }
}
使用Stack类
进行测试前,要初始化Stack类,然后根据所需进行测试。
? var s = new Stack()
6.栈的应用
十进制转化成二进制
? function dec2bin(decNumber){
?
? var stack = new Stack()
?
? while(decNumber > 0){
?
? stack.push(decNumber % 2)
?
? decNumber = Math.floor(decNumber / 2)
? }
?
? var binaryString = ''
? while(!stack.isEmpty()){
? binaryString += stack.pop()
? }
? return binaryString
? }
?
? alert(dec2bin(100))
?
?
修改一下算法,实现十进制转换为任意进制
? function baseConverter(decNum, base) {
? var base = (base >= 2 && base <= 16) ? base : 10
? remStack = new Stack()
? rem
? baseStr = ''
? digits = '0123456789ABCDEF'
? while(decNum) {
? rem = Math.floor(decNum % base)
? decNum = Math.floor(decNum / base)
? remStack.push(rem)
? }
? while(!remStack.isEmpty()) {
? baseStr += digits[remStack.pop()]
? }
? return baseStr## 标题
? }
|