基本概念
栈和行列
都是动态的鸠合,在栈中,能够去掉的元素是近来插进去的哪个。栈完成了后进先出。在行列中,能够去掉的元素总是在鸠合中存在的时候最长的那一个。行列完成了先进先出的战略。
栈的官方定义:栈(Stack)是一个后进先出(Last in first out,LIFO
)的线性表,它请求只在表尾举行删除和插进去操纵。关于栈来讲,这个表尾称为栈的栈顶,响应的表头称为栈底。入栈运用push()
要领。出栈运用pop()
要领。
最最先栈中不含有任何数据,叫做空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底星散,全部栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,全部栈的当前容量变小。
我们把作用于行列上的INSERT
操纵称为入队(Enqueue
),把作用于行列上的DELETE操纵称为出队(Dequeue)。我们运用变量top来纪录栈顶元素的位置和标记那里能够到场新的元素,当向栈内压入元素时,该变量增大;从栈内弹出元素时,该变量减小。
栈和行列的区分
栈的插进去和删除操纵都是在一端举行的,而行列的操纵倒是在两头举行的。
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
这里定义了一个递次存储的栈,它包含了三个元素:base,top,stackSize。
个中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;
}
入栈操纵
入栈操纵又叫压栈操纵,就是向栈中寄存数据。
入栈操纵要在栈顶举行,每次向栈中压入一个数据,top指针就要+1,晓得栈满为止。
出栈操纵
出栈操纵就是在栈顶掏出数据,栈顶指针随之下移的操纵。
每当从栈内弹出一个数据,栈的当前容量就-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()要领
先来完成push()
要领,当向栈中压入一个新元素时,须要将其保留在数组中变量top对应的位置,然后将top值加1:
function push(element){
this.dataStore[this.top++] = element;//top值加1,指向下一个空位置
}
pop()要领
function pop(){
return this.dataStore[--this.top];//pop要领与push相反
}
peek()要领
peek
要领返回数组的第一个top-1
位置的元素,即栈顶元素:
function peek(){
return this.dataStore[this.top-1];
}
length()要领
length
要领经由过程返回变量top值的要领返回栈内的元素的个数:
function length(){
return this.top;
}
clear()要领
将变量top
的值设为0,就能够清空一个栈了:
function clear(){
this.top = 0;
}