一,栈的定义
二,顺序栈
三,链栈
一,栈的定义
栈是一种线性表,插入删除的操作都在一段进行,这端一般为栈顶
栈是先进后出的线性表,简称LIFO表
数据元素:任意类型但是必须属于一个数据对象
栈中数据元素为线性关系
栈分为两种存储结构:顺序存储和链式存储
二,顺序栈
顺序栈必须在栈顶附设一个位置指针top来动态指示栈顶元素在栈中的位置
通常 top=-1 表示空栈
GetTop的意思是取栈顶元素,但是他的指针位置不变,就是说,我只是把这个元素赋到了另外一个变量或者空间里,但是栈顶的这个元素并没有弹出
栈的初始化
Status Initstack(SqStack &s){
s.top = -1; //栈的初始化,如果栈顶指针 top 等于-1 则栈为空栈
s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
入栈
public void push(T obj){
if(top==stackArray.length-1){
T[] p=(T[]) new Object[top*2+2];
for(int i=0;i<=top;i++){
p[i]=stackArray[i];
}
stackArray=p;
}
top++;
stackArray[top]=obj;
}
出栈
pub
lic T pop(){
if(top==-1){
System.out.println("数据栈已空,无法删除元素");
return null;
}
top--;
return stackArray[top+1];
}
取出栈顶元素
public T getHead(){
if(top==-1){
System.out.println("数据栈已空,无法删除元素");
return null;
}
return stackArray[top];
}
三,链栈
链栈是指采用链接存储的结构实现的栈。事实上链栈和链表的样子很像。
入栈
在栈顶插入值为x的元素存放在一个新创建的LinkStack的data中。原本的LS与新创建的LinkStack的next相等。然后LS与原来的首元素断开,与x连接。如图:
LinkStack *Push(LinkStack *LS,datatype x)
{
LinkStack *p;
p=(LinkStack *)malloc(sizeof(LinkStack))
p->data=x;
p->next=LS;
LS=p;
return LS;
}
出栈
首先将创建一个新的LinkStack *pop,不需要分配内存空间。直接将pop指向出栈data,LS指向pop的next空间。然后断开LS原本指向pop中data。
LinkStack *POP(LinkStack *LS)
{
LinkStack *poptem;
poptem=LS;
LS=poptem->next;
free(poptem);
return LS;
}