棧__資料結構

來源:互聯網
上載者:User

棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。 1.順序棧

#include<stdio.h>#include<stdlib.h> #define initSize 30typedef int DataType;typedef int SElemType;  typedef struct {//順序棧的動態儲存裝置結構    SElemType *elem;      int maxsize, top;}SeqStack;     void InitStack(SeqStack &S) {//建立一個最大尺寸為initsize的空棧,若分配不成功則進行錯誤處理       S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//建立棧空間     if(S.elem==NULL) {        printf("儲存空間分配失敗。\n");        exit(1);    }    S.maxsize=initSize;    S.top=-1; }     int Push(SeqStack &S, DataType x) {//進棧操作, 若棧不滿,則將元素 x 插入棧頂, 函數返回 1 ,否則棧溢出,函數返回 0;       if(S.top==S.maxsize-1) return 0;//棧滿則溢出處理       S.elem[++S.top]=x;//棧頂指標先加 1 ,再進棧       return 1;}     int Pop(SeqStack &S, SElemType &x) {      //退棧; 若棧不空,則函數通過引用參數x 返回棧頂元素值,棧頂指標退 1, 函數指標返回 1;      if(S.top==-1) return 0;      x=S.elem[S.top--];      return 1;   }     int GetTop(SeqStack &S, SElemType &x) {      //讀取棧頂元素的值:若棧不空則函數返回棧頂的值且函數返回 1, 否則函數返回 0      if(S.top==-1) return 0;      x=S.elem[S.top];      return 1;   }     int StackEmpty (SeqStack &S) {//函數測試棧S是否空,若棧空,函數返回 1, 否則返回 0       return S.top==-1;//函數返回S.top==-1 的結果   }     int StackFull(SeqStack &S) {//測試棧S 是否滿 ,若棧滿,函數返回 1, 否則返回 0      return S.top==S.maxsize;//此處為一邏輯運算式, 返回邏輯值的結果   }     int StackSize(SeqStack &S) {//函數返回棧 S 的長度,即,棧中元素的個數       return S.top+1;}      void Reverse(SElemType A[], int n) {//請空棧     SeqStack S;    InitStack(S);    int i;      for(i=1; i<=n; i++) Push(S, A[i-1]);           i=0;      while(!StackEmpty(S)) Pop(S, A[i++]);  }

2.鏈式棧

<stdio.h>#include<stdlib.h> typedef int DataType;typedef int SElemType;typedef struct node {SElemType data;struct ndoe *link; }LinkNode, *LinkStack; void InitStack(LinkStack &S) {S=NULL;} int Push(LinkStack &S, SElemType x) {//鏈式棧初始化;置頂棧指標,即鏈表頭指標為空白 LinkNode *p=(*LinkNode) malloc (sizeof(LinkNode));//建立新節點 p->data=x;p->link=S;S=p;//新節點插在鏈頭 return 1;} int Pop(LinkStack &S, SElemType &x) {//退棧,若棧空,函數返回 0 ,參數值 X不可用 if(S==NULL) return 0;LinkNode *p=S;x=p->data;//存棧頂元素 S=p->link;free(p);//棧頂指標退到新棧頂位置 return 1;} int GetTop(LinkStack &S, SElemTye &x) {//讀取棧頂,若棧不空,函數通過引用參數X 返回棧頂元素的值 if(S==NULL) return 0;//棧空,函數返回 0 x=S->data;return 1;}  int StackEmpty (LinkkStack &S) {//判斷棧是否為空白 return s==NULL;} int StackSize(LinkStack &S) {//求棧的長度,計算棧元素的個數 LinkNode *p=S;int k=0;while(p!=NULL) {//逐個節點計算 p=p->link;k++;}return k;}

應用:

用順序棧寫標頭檔(軟體:DEVc++)

#ifndef __STACK_H__#define __STACK_H__#include<stdio.h>#include<stdlib.h> #define initSize 30typedef int DataType;typedef int SElemType;  typedef struct {//順序棧的動態儲存裝置結構    SElemType *elem;      int maxsize, top;}SeqStack;     void InitStack(SeqStack &S) {//建立一個最大尺寸為initsize的空棧,若分配不成功則進行錯誤處理       S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//建立棧空間      if(S.elem==NULL) {          printf("儲存空間分配失敗。\n");          exit(1);      }    S.maxsize=initSize;    S.top=-1;  }     int Push (SeqStack &S, DataType x) {//進棧操作, 若棧不滿,則將元素 x 插入棧頂, 函數返回 1 ,否則棧溢出,函數返回 0;       if(S.top==S.maxsize-1) return 0;//棧滿則溢出處理       S.elem[++S.top]=x;//棧頂指標先加 1 ,再進棧       return 1;  }     int Pop(SeqStack &S, SElemType &x) {      //退棧; 若棧不空,則函數通過引用參數x 返回棧頂元素值,棧頂指標退 1, 函數指標返回 1;      if(S.top==-1) return 0;      x=S.elem[S.top--];      return 1;   }     int GetTop(SeqStack &S, SElemType &x) {      //讀取棧頂元素的值:若棧不空則函數返回棧頂的值且函數返回 1, 否則函數返回 0      if(S.top==-1) return 0;      x=S.elem[S.top];      return 1;   }     int StackEmpty (SeqStack &S) {//函數測試棧S是否空,若棧空,函數返回 1, 否則返回 0       return S.top==-1;//函數返回S.top==-1 的結果   }     int StackFull(SeqStack &S) {//測試棧S 是否滿 ,若棧滿,函數返回 1, 否則返回 0      return S.top==S.maxsize;//此處為一邏輯運算式, 返回邏輯值的結果   }     int StackSize(SeqStack &S) {//函數返回棧 S 的長度,即,棧中元素的個數       return S.top+1;}      void Reverse(SElemType A[], int n) {//請空棧     SeqStack S;    InitStack(S);    int i;      for(i=1; i<=n; i++) Push(S, A[i-1]);           i=0;      while(!StackEmpty(S)) Pop(S, A[i++]);  }#endif
注意儲存的時候,儲存的格式為stack.h, 而不是stack.cpp;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.