1. 程式人生 > >棧的基本操作(+例項)

棧的基本操作(+例項)

棧:是限定僅在表尾進行插入或刪除操作的線性表,表尾段稱為棧頂,表頭段稱為棧底,棧有稱後進先出線性表。棧有順序棧和鏈棧。

1、順序棧的結構定義

//順序棧的儲存結構
typedef struct{
    ElemType *base;//棧底指標變數 
    ElemType *top;//棧頂指標變數 
    int stackSize;//當前可使用的最大容量 
}sqStack;

2、建立一個空棧

//建立一個空棧
#define STACK_INIT_SIZE 100  //儲存空間初始分配量 
#define STACKINCREMENT 10 //儲存空間分配增量 
Status InitStack(SqStack 
&s){ s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base; s.stackSize = STACK_INIT_SIZE; return OK; }

3、元素入棧

//元素入棧
Status Push(SqStack &s, ElemType e){
    if( s.top-s.base >= s.stackSize ){//若棧滿則追加空間 
s.base = (ElemType *)realloc(s.base,(s.stackSize+STACKINCREAMENT)*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base+s.stackSize; //設定棧頂 s.stackSize = s.stackSize+STACKINCERMENT; //設定棧的最大容量 } *s.top = e; s.top++; //*s.top++ = e; }

4、元素出棧

//元素出棧 
Status Pop(SqStack &s, ElemType &e){
    //若棧不為空,則用e返回s的棧頂元素
    if( s.top == s.base )
        return ERROR;
    e = *--s.top;  //s.top指標先向下移動一個位置,再取出其中的元素
    return OK; 
} 

5、清空一個棧(將棧頂指標指向棧底指標)

//清空一個棧
Status ClearStack(SqStack &s){
    s.top = s.base; //棧頂指標指向棧底指標
    return OK; 
} 

6、銷燬一個棧

//銷燬棧
Status DestroyStack(SqStack &s){
    int len = s.stackSize;
    for(int i =0; i < len; i++){
        free(s.base);
        s.base++;
    }
    s.base = s.top = NULL;
    s,stackSize = 0;
} 

7、返回棧的當前容量

//返回棧當前容量
Status StackLen(SqStack &s){
    return (s.yop-s.base);
} 

棧的應用(進位制間的轉換):