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


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

#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);  
    
}  

 

參考了別人寫的代碼,自己又把代碼敲了一遍。但是還是不熟悉。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM