資料結構(嚴蔚敏)順序棧

來源:互聯網
上載者:User
接上次講的!哦!今天給出順序棧的基本操作(9個)!代碼如下(貼上就能運行) 

我的一些觀點: 如果初始STACK_INIT_SIZE定義10,那麼最好只存9個,如果存了10個,棧滿了,TOP指標就指向了無效物理地址,此時如果有對TOP指標的誤操作,就會產生指標溢出的現象!不安全了!

#include "stdafx.h"

 #include<string.h>
 #include<ctype.h>
 #include<malloc.h> //malloc()等
 #include<limits.h> // INT_MAX等
 #include<stdio.h> // EOF(=^Z或F6),NULL
 #include<stdlib.h> // atoi()
 #include<io.h> // eof()
 #include<math.h> // floor(),ceil(),abs()
 #include<process.h> // exit()
 // 函數結果狀態碼
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 // #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
 typedef int Status; // Status是函數的類型,其值是函數結果狀態碼,如OK等
 typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE

  // c3-1.h 棧的順序儲存表示
 #define STACK_INIT_SIZE 10 //儲存空間初始分配量
 #define STACKINCREMENT 2 // 儲存空間分配增量

 typedef int SElemType; // 定義棧元素類型為整型
 typedef struct SqStack
 {
   SElemType *base; // 在棧構造之前和銷毀之後,base的值為NULL
   SElemType *top; // 棧頂指標 */
   int stacksize; // 當前已指派的儲存空間,以元素為單位
 }SqStack; // 順序棧

 //bo3-1.c 順序棧(儲存結構由c3-1.h定義)的基本操作(9個)
 Status InitStack(SqStack *S)
 { // 構造一個空棧S
   (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
   if(!(*S).base)
     exit(OVERFLOW); /* 儲存分配失敗 */
   (*S).top=(*S).base;
   (*S).stacksize=STACK_INIT_SIZE;
   return OK;
 }

 Status DestroyStack(SqStack *S)
 { /* 銷毀棧S,S不再存在 */
   free((*S).base);
   (*S).base=NULL;
   (*S).top=NULL;
   (*S).stacksize=0;
   return OK;
 }

 Status ClearStack(SqStack *S)
 { /* 把S置為空白棧 */
   (*S).top=(*S).base;
   return OK;
 }

 Status StackEmpty(SqStack S)
 { /* 若棧S為空白棧,則返回TRUE,否則返回FALSE */
   if(S.top==S.base)
     return TRUE;
   else
     return FALSE;
 }

 int StackLength(SqStack S)
 { /* 返回S的元素個數,即棧的長度 */
   return S.top-S.base;
 }

 Status GetTop(SqStack S,SElemType *e)
 { /* 若棧不空,則用e返回S的棧頂元素,並返回OK;否則返回ERROR */
   if(S.top>S.base)
   {
     *e=*(S.top-1);
     return OK;
   }
   else
     return ERROR;
 }

 Status Push(SqStack *S,SElemType e)
 { /* 插入元素e為新的棧頂元素 */
   if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加儲存空間 */
   {
     (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!(*S).base)
       exit(OVERFLOW); /* 儲存分配失敗 */
     (*S).top=(*S).base+(*S).stacksize;
     (*S).stacksize+=STACKINCREMENT;
   }
   *((*S).top)++=e;
   return OK;
 }

 Status Pop(SqStack *S,SElemType *e)
 { /* 若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK;否則返回ERROR */
   if((*S).top==(*S).base)
     return ERROR;
   *e=*--(*S).top;
   return OK;
 }

 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
 { /* 從棧底到棧頂依次對棧中每個元素調用函數visit()。 */
   /* 一旦visit()失敗,則操作失敗 */
   while(S.top>S.base)
     visit(*S.base++);
   printf("/n");
   return OK;
 }
 Status visit(SElemType c)
 {
   printf("%d ",c);
   return OK;
 }
int main(int argc, char* argv[])
{
 int j;
   SqStack s;
   SElemType e;
   if(InitStack(&s)==OK)
     for(j=1;j<=12;j++)
       Push(&s,j);
   printf("棧中元素依次為:");
   StackTraverse(s,visit);
   Pop(&s,&e);
   printf("彈出的棧頂元素 e=%d/n",e);
   printf("棧空否:%d(1:空 0:否)/n",StackEmpty(s));
   GetTop(s,&e);
   printf("棧頂元素 e=%d 棧的長度為%d/n",e,StackLength(s));
   ClearStack(&s);
   printf("清空棧後,棧空否:%d(1:空 0:否)/n",StackEmpty(s));
   DestroyStack(&s);
   printf("銷毀棧後,s.top=%u s.base=%u s.stacksize=%d/n",s.top,s.base, s.stacksize);
 return 0;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.