文章目录
第四章 栈和队列
栈的定义:
限定仅在表尾进行插入和删除操作的线性表,我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的叫空栈。栈又称后进先出的线性表(Last In First Out),简称LIFO结构。
栈就像子弹弹夹,先放进去的后出来,最后放进去的第一个出来,后退、撤销等操作都是用的栈实现的。
栈的插入操作:叫进栈,也称压栈、入栈,类似子弹入弹夹。
栈的删除操作:叫出栈,也叫弹栈,如同弹夹的子弹弹出。
注意:栈的变化很多,不一定第一个进就要最后一个出,可能是进出进出。
栈的抽象数据类型:
普通情况、空栈、栈满:
结构定义和出入栈代码
栈的结构定义代码:
typedef int SElemType;
typedef struct
{
SElemType data[MAXSIZE];
int top; // 栈顶指针
}SqStack;
入栈代码:
Status Push(SqStack *S, SElemType e)
{
if (S->top == MAXSIZE - 1) // 栈满
{
return ERROR;
}
S->top++; // 栈顶指针后移
S->data[S->top] = e; // 将新插入元素赋值给栈顶空间
return OK;
}
出栈操作:
Status Pop(SqStack *S, SElemType *e)
{
if (S->top == -1)
{
return ERROR;
}
*e = S->data[S->top]; // 将要删除的栈顶元素赋值给e
S->top--; // 栈顶指针-1
return OK;
}
JAVA实现栈
栈类:
public class stack {
public Object[] data;
public int top;
public stack() {
}
}
class Stack_{
private int MAXSIZE;
private stack Sta;
// 初始化
public Stack_(int MAXSIZE) {
this.MAXSIZE = MAXSIZE;
Sta = new stack();
Sta.data = new Object[MAXSIZE];
Sta.top = -1; // 从-1开始,比较方便,能和数组index对应上
}
// 入栈
public void push(Object e){
// 判断是否满栈
if (Sta.top == MAXSIZE-1)
throw new IndexOutOfBoundsException("满栈了");
Sta.top++;
Sta.data[Sta.top] = e;
}
public Object pop(){
if (Sta.top == -1)
throw new IndexOutOfBoundsException("已经是空栈了,无法再删除");
Object data = Sta.data[Sta.top];
Sta.data[Sta.top] = null;
Sta.top--;
return data;
}
public void show(){
for (int i = 0; i < Sta.top + 1; i++) {
System.out.println(Sta.data[i]);
}
}
}
测试代码:
public class main {
public static void main(String[] args) {
Stack_ S = new Stack_(3);
S.push(12);
S.push(13);
S.push(14);
S.show();
System.out.println("删除:" + S.pop());
}
}
两栈共享空间
一图胜千言:
top1是栈1的栈顶指针,top2为栈2的栈顶指针,除去存在空栈的情况下,top1 + 1 = top2 的时候,为栈满。
空间结构
typedef struct
{
SElemType data[MAXSIZE]