基本概念

逻辑结构

定义

  • (Stack):只允许在一端进行插入或删除操作的线性表
  • 栈顶(Top):线性表允许进行插入和删除的一端。
  • 栈底(Bottom):固定的,不允许进行插入和删除的一端。
  • 空栈:不含任何元素的空表。

特点

后进先出(Last In First Out,LIFO)

n个元素进栈,1/(n+1)Cn-2n种出栈方式。

声明栈时分配内存,函数运行结束后系统自动回收。

基本操作

  1. InitStack(&S):初始化。
  2. StackEmpty(S):判断栈S是否为空,empty->truth。
  3. Push(&S,x):进栈,栈未满则加入x使之成为新栈顶。
  4. Pop(&S,&x):出栈,弹出栈顶元素并用x返回。
  5. GetTop(S,&x):获取栈顶元素,非空则用x返回。
  6. DestroyStack(&S):销毁栈,释放栈S占用的存储空间。

存储结构

顺序栈
  1. 顺序存储

  2. 用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时设一个指针top,指示当前栈顶的位置。

  3. 栈空条件、栈满条件、栈长,有无头节点

  4. 共享栈:两个顺序栈共享一个一维数据空间。

    两个栈的栈顶指针都指向栈顶元素

    top0= =-1时,0号栈为空;

    top1= =Maxsize时,1号栈为空。

    两个栈顶指针相邻时,(top1-top0=1)时,栈满。

//声明:懒得打了


s.data[s.top];//栈顶元素
//初始化顺序栈
void InitStack(SqStack &S){
    //初始栈顶指针
    S.top=-1;
    
    //无头结点,即指针指向栈顶元素的下一个
    //s.top=0;
}

//判断栈空
bool stackEmpty(SqStack S){
    if(S.top==-1)	//empty
        return true;
    else
        return false;	//not empty
}

//进栈
bool Push(SqStack &S,ElemType x){
    if(S.top==MaxSize-1)
        return false;
   //指针先加1再入栈
    S.data[++S.top] = x;
    //无头结点
    //s.data[s.top++] = x;
    	return true;
}

//出栈
bool StackEmpty(SqStack &S,ElemType &x){
    if(S.top==-1)
        return false;
    //元素先出栈,指针再后移
    x=S.data[S.top--];
    //无头结点
    //x=S.data[--S.top];
    	return true;
}

//读栈顶元素
bool GetTop(SqStack S,ElemType &x){
    if(S.top==-1)
        return false;
    x=S.data[S.top];
    return true;
}
链栈
  1. 链式存储
  2. 多个栈共享存储空间,提高效率
  3. 不存在栈满上溢
  4. 只能在表头进行操作
  5. 没有头节点,Lhead指向栈顶元素
缓冲区的上溢和下溢

上溢就是缓冲器满,还往里写;

下溢就是缓冲器空,还往外读.

数据运算

posted @ 2021-12-26 12:53  wangqr  阅读(115)  评论(0)    收藏  举报