栈和队列
都是动态的集合,在栈中,能够去掉的元素是最近插入的哪个。栈实现了后进先出。在队列中,能够去掉的元素老是在集合中存在的时间最长的那一个。队列实现了先进先出的策略。数组
栈的官方定义:栈(Stack)是一个后进先出(Last in first out,LIFO
)的线性表,它要求只在表尾进行删除和插入操做。对于栈来讲,这个表尾称为栈的栈顶,相应的表头称为栈底。入栈使用push()
方法。出栈使用pop()
方法。this
最开始栈中不含有任何数据,叫作空栈,此时栈顶就是栈底。而后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。spa
咱们把做用于队列上的INSERT
操做称为入队(Enqueue
),把做用于队列上的DELETE操做称为出队(Dequeue)。咱们使用变量top来记录栈顶元素的位置和标记哪里能够加入新的元素,当向栈内压入元素时,该变量增大;从栈内弹出元素时,该变量减少。指针
栈的插入和删除操做都是在一端进行的,而队列的操做倒是在两端进行的。code
typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack;
这里定义了一个顺序存储的栈,它包含了三个元素:base,top,stackSize。blog
其中base是指向栈底的指针变量,top是指向栈顶的指针变量,stackSize指示栈的当前可以使用的最大容量。队列
#define STACK_INIT_SIZE 100 initStack(sqStack *s) { s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) ); if( !s->base ) exit(0); s->top = s->base; // 最开始,栈顶就是栈底 s->stackSize = STACK_INIT_SIZE; }
入栈操做又叫压栈操做,就是向栈中存放数据。element
入栈操做要在栈顶进行,每次向栈中压入一个数据,top指针就要+1,知道栈满为止。it
出栈操做就是在栈顶取出数据,栈顶指针随之下移的操做。io
每当从栈内弹出一个数据,栈的当前容量就-1。
入队列操做其实就是在队尾追加一个元素,不须要任何移动,时间复杂度为O(1)。
出队列则不一样,由于咱们已经架设下标为0的位置是队列的队头,所以每次出队列操做全部元素都要向前移动。
push():入栈操做 pop():出栈操做(返回栈顶元素并删除t) peak():返回栈顶元素而不删除它 clear():清除栈内全部元素 length():记录栈内元素的个数 empty属性:表示栈内是否含有元素
function Stack(){ this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; }
用一个数组dataStore
来保存栈内元素,变量top记录栈顶位置
先来实现push()
方法,当向栈中压入一个新元素时,须要将其保存在数组中变量top对应的位置,而后将top值加1:
function push(element){ this.dataStore[this.top++] = element;//top值加1,指向下一个空位置 }
function pop(){ return this.dataStore[--this.top];//pop方法与push相反 }
peek
方法返回数组的第一个top-1
位置的元素,即栈顶元素:
function peek(){ return this.dataStore[this.top-1]; }
length
方法经过返回变量top值的方法返回栈内的元素的个数:
function length(){ return this.top; }
将变量top
的值设为0,就能够清空一个栈了:
function clear(){ this.top = 0; }