1. 程式人生 > >3.數據結構筆記學習--棧和隊列

3.數據結構筆記學習--棧和隊列

nbsp 初始化 判斷 頭插法 truct 聲明 oid color pty

  • 棧的基本概念:
    • 棧的定義:一種只能在一端進行插入或者刪除的線性表,這一端稱為棧頂
    • 棧的特點:先進後出
    • 棧的存儲結構:順序棧和鏈式棧

  • 隊列的基本概念:
    • 隊列的定義:允許在表的一端(隊尾)進行插入,在另一端(隊頭)進行刪除的線性表
    • 隊列的特點:先進先出
    • 隊列的存儲結構:順序隊和鏈隊

  • 棧和隊列的存儲結構、算法:
    • 順序棧的定義:
      typedef struct
      {
          int data[maxSize];  //存放棧中的元素
          int top;        //棧頂指針
      }SqStack;
    • 鏈棧結點定義:
      typedef struct LNode
      {
          
      int data; //數據域 int LNode *next;//指針域 }LNode;
    • 順序隊列定義:
      typedef struct 
      {
          int data[maxSize];       
          int front;//隊首指針
          int rear; //隊尾指針
      }SqQueue;
    • 鏈隊定義:
      • 隊結點類型定義:
        typedef struct QNode
        {
            int data;       
            struct QNode *next; //指針域
        }QNode;
      • 鏈隊類型定義:
        typedef struct 
        {
            QNode *front;
            QNode 
        *rear; }LiQueue;

  • 順序棧的基本算法操作:
    • 順序棧st的要素
      • 兩個狀態:
        • 棧空狀態:st.top==-1
        • 棧滿狀態:st.top==maxSize-1;
      • 兩個操作:
        • 元素x進棧操作 ++(st.top); st.data[st.top]=x;
        • 元素x出棧操作 x=st.data[st.top]; --(st.top);
      • 非法狀態,上溢和下溢

    • 初始化棧的算法:
      void initStack(Sqstack &st) //初始化棧
      {
          st.top = -1;   //將棧頂設置為-1
      }
    • 判斷棧空的算法:
      int isEmpty(Sqstack st) 
      {
         if(st.top==-1)
              return 1;
         else
              return 0;
      }
    • 進棧算法:
      int Push(SqStack &st, int x)
      {
          if(st.top == maxSize-1)
              return 0;
          ++(st.top);                        //先移動指針再進棧
          st.data[st.top]=x;
              return 1;
      }
    • 出棧算法:
      int Pop(SqStack &st, int &x)
      {
          if(st.top == -1)
              return 0;
          x = st.data[st.top];   //先取出元素,再進行指針的移動
          --(st.top);
              return 1;
      }

    • 考題中實用的棧操作寫法:
      • 聲明一個棧並且初始化: int stack[maxSize]; int top=-1; //聲明加初始化都有了
      • 元素x進棧: stack[++top]=x;
      • 元素x出棧: x=stack[top--];
      • //++top 與top++的區別 :a=++top 是 top 先自增1,再將top值給a; 而b=top++ 是top先給b,再進行top自增1

  • 鏈棧的基本算法操作:
    • 鏈棧的要素:
      • 狀態:
        • 棧空狀態:1st ->next = null;
      • 兩個操作:
        • 元素進棧:
          p->next = 1st->next;
          1st->next = p;    //頭插法建立鏈表的插入操作
        • 出棧操作:
          p = 1st->next;
          x = p->data;
          1st->next = p->next;
          free(p);   //單鏈表刪除操作
    • 鏈棧的初始化算法:
      void InitStack(LNode *&1st)
      {
          1st = (LNode*) malloc(sizeof(LNode));  //制造一個頭結點
          1st->next = NULL;
      }

    • 判斷棧空的算法:
      int isEmpty(LNode *1st)
      {
          if(1st->next = NULL)
              return 1;
          else 
              return 0;
      }

    • 進棧算法:
      void push(LNode *1st,int x)
      {
          LNode *p;
          p = (LNode*)malloc(sizeof(LNode));
          p->next = NULL;
          
          
          P->data = x;
          p->next = 1st->next;
          1st->next = p;
      }

    • 出棧算法:
      void Pop(LNode *1st,int &x)
      {
          LNode *p;
          if(1st->next==NULL)
              return 0;
          
      //單鏈表刪除操作
          p = 1st->next;
          x = p->data;
          1st->next = p->next;
          free(p);
          return 1;
      }

3.數據結構筆記學習--棧和隊列