[數據結構與算法] 入棧出棧操做總結

最近要參加數據結構與算法期末考試了,在這裏總結一下出棧入棧的一些常規操做。算法

#include  <stdlib.h>   
#include "stdio.h"   
#include<string.h>  
typedef char SElemType;       //棧數據元素的類型  
#define STACK_INIT_SIZE 10  //棧存儲空間的初始分配量  
#define STACKINCREMENT 10    //棧存儲空間的分配增量  
typedef struct  
{  
    SElemType *base;         //構造以前和銷燬以後,base的值爲NULL  
    SElemType *top;             //棧頂指針  
    int stacksize;           //當前分配的存儲容量(以sizeof(SElemType)爲單位)  
}Stack;  
 
char InitStack(Stack &S)  
{  
    S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //經過malloc函數分配空間  
    if (!S.base)  
        return 0;               //若是分配失敗,則返回0  
    S.top=S.base;                //棧頂指針設爲棧底地址  
    S.stacksize=STACK_INIT_SIZE; //當前分配的空間  
    return 1;  
}  
 
char StackEmpty(Stack S)  
{  
    if (S.base)  
    {  
        if (S.base==S.top)       //若是棧爲空棧,則返回1(true),不然返回0(false)  
        {  
            return 1;  
        }  
    }  
    return 0;  
}  
 
char Push(Stack &S,SElemType e)  
{  
    if (S.base)  
    {  
        if ((S.top-S.base)>=S.stacksize)    //棧滿,追加存儲空間  
        {  
            S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)* sizeof(SElemType));  
            if(S.base==NULL)  
                return 0;                  //若是從新分配空間失敗,則返回0(false),表示插入不成功  
            S.top=S.base+S.stacksize;               //設置數組的新地址  
            S.stacksize+=STACKINCREMENT;    //分配空間要加上新增的空間  
        }  
        *S.top++=e; 
        return 1;  
    }  
    return 0;  
}  
//*S.top++=e     
//棧頂位置後++,本次運算S.top棧空間不變,因此是把S棧頂指針指向E,運算完成後棧空間才自增1  
//*++S.top=e  
//棧頂位置前++,本次運算S.top棧頂向前增長1,因此是把S棧新增的棧頂指向E。  
char Pop(Stack &S,SElemType &e)  
{  
    if (S.base)  
    {  
        if (S.top>S.base)    //若棧不是空的  
        {  
            e=*--S.top;  
            return 1;  
        }  
    }  
    return 0;  
}  
 
char StackTraverse(Stack &S)//依次輸出從棧底到棧頂的每一個元素  
{  
    int i;  
    if (S.base)  
    {  
        printf("\n依次輸出從棧底到棧頂的每一個元素爲:\n");  
        for(i=0;i<S.top-S.base;i++)  
        {  
            printf("%c  ",S.base[i]);   //依次打印數據元素  
        }  
        printf("\n");  
        return 1;  
    }  
    return 0;  
}  
 
void main()  
{  
    Stack S;  
    char x,y;  
    InitStack(S);  
    x='c';y='k';  
    Push(S,x);StackTraverse(S);
    Push(S,'a');StackTraverse(S);
    Push(S,y);StackTraverse(S);  
    Pop(S,x);StackTraverse(S);
    Push(S,'t');StackTraverse(S);
    Push(S,x);StackTraverse(S);  
    Pop(S,x);StackTraverse(S);
    Push(S,'s');StackTraverse(S);  
    while(!StackEmpty(S)){
        Pop(S,y);StackTraverse(S);
        printf("%c",y);
    }  
    printf("%c\n",x);  
    
}  

 

參考了別人寫的代碼,本身又把代碼敲了一遍。可是仍是不熟悉。數組

一回生,二回熟嘛!多多練習就能掌握了。數據結構

相關文章
相關標籤/搜索