• 栈的笔记(2)--顺序栈


    顺序栈是利用一组地址连续的储存单元依次存放栈顶到栈底的数据元素,同时,还必须附加一个指针top(栈顶指针),来动态储存栈顶元素在顺序战中的位置。(通常,top=-1表示空栈)

    储存结构如下:

     #define Stack_Size 50//设栈中的元素为50  

    typedef struct  {   

        StackElementType elem[Stack_Size];//用来存放栈中元素的一维数组  

         int top;//用来存放栈顶元素的下标,top为-1时,表示栈为空  

    }SeqStack;

    初始化顺序栈  

    void InitStack(SeqStack *S)

     {  

       S->top=-1;//构建一个空栈S,栈顶为空  

    }

    进栈(先判断栈是否为满,如果为满,返回FALSE)

     int Push(SeqStack *S,StackElementType x)  

    {    

       if(S->top==Stack_size-1)//栈已满    

          return (FALSE);   

        S->top++;  

         S->elem[S->top]=x;  

         return(TRUE);

     }

    出栈(先判断栈是否为空,若为空,返回FALSE)

     int Pop(SeqStack *S,StackElementType *x)  

    {    

       if(S->top==-1)//栈为空   

         return(FALSE);  

       else{    

        *x=S->elem[S->top];//把栈顶元素放到x所指向的存储空间中   

         S->top--;   

         return(TRUE);    

        }  

    }

    读取栈顶元素(先判断栈是否为空,若为空,返回FALSE)  

    int GetTop(SeqStack *S,StackElementType *x)  

    {   

        if(S->top==-1)//栈为空    

          return(FALSE);   

        else   {    

            *x=S->elem[S->top];///把栈顶元素放到x所指向的存储空间中    

          return(TRUE);   }

     }

    多栈共享技术  一个程序使用多个栈时,为防止有的栈溢出,可以 让多个栈共用一个足够大的数组。  最常用的是两个栈的共享技术,即双端栈。他主要利用了“栈底位置不变,栈顶位置动态变化”的特性。  首先,申请一个共享的一维数组S[M],将两个栈的栈底,分别放到一维数组的两端,分别为0,M-1

    数据结构定义为:  

     #define M 100   //假设,两个栈的和用大小为100  

      typedef struct  {   

        StackElementType Stack[M];   

        StackElementType top[2];

       }DqStack;

    双端顺序栈初始化  

      void InitStack(DqStack *S)

       {   

          S->top[0]=-1;  

           S->top[1]=M;  

      }

    双端顺序栈进栈(需先判断栈是否为满)  

      int Push(DqStack *S,StackElementType x,int i)  

      {  

         \把数据元素装入第i号堆栈  

         if(S->top[0]+1==S->top[1])    

          return(FALSE);   

        switch(i)   {   

           case 0:     S->top(0)++;     S->Stack[S->top[0]]=x;     break;    

          case 1:     S->top[1]--;     S->Stack[S->top[1]]=x;     break;    

          default:     return(FALSE);    

            }  

          return(TRUE);

     }

    双端顺序栈出栈

     int Pop(DeStack *S,StackElmentType *x,int i)

     {  

       Switch(i)   {    

        case 0:     if(S->top[0]==-1)      return(FALSE);     *x=S->Stack[S->top[0]];     S->top[0]--;     break;    

        case 1:     if(S->top[1]==M)      return(FALSE);     *x=S->Stack[S->top[1]];     S->top[1]++;     break;    

        default:     return(FALSE);   

          }  

       return(TRUE);

     }

  • 相关阅读:
    如何利用docker制作自己的镜像
    python 获取当前运行的 class 和 方法的名字
    UnitTest-case参数化
    值得推崇的一种图书出版的方式----开源图书
    Django中对数据查询、删除、修改
    wireshark网络实战分析二
    wireshark网络抓包分析
    邮件传输协议实战抓包分析
    socket服务端给客户端发送数据第一次不成功,第二次成功
    转载:Wireshark抓包详解
  • 原文地址:https://www.cnblogs.com/chen521/p/4104268.html
Copyright © 2020-2023  润新知