數據結構--棧

/*
    棧是允許在同一端進行插入和刪除操作的特殊線性表。"先進後出"  像往箱子裏裝東西
    允許進行插入和刪除操作的一端稱爲棧頂(top),另一端爲棧底(bottom);
    棧底固定,而棧頂浮動;
    棧中元素個數爲零時稱爲空棧。
    插入一般稱爲進棧(PUSH),刪除則稱爲退棧(POP)。棧也稱爲後進先出表。

*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"

int main()
{
    MyStack stack1;
    int Value;


    InitStack(& stack1);      //初始化棧
    PushStack(& stack1, 1);   //壓棧
    PushStack(& stack1, 2);
    PushStack(& stack1, 22);


    PopStack(& stack1, &Value);


    Traverse(& stack1);      //對棧進行遍歷


    ClearStack(& stack1);
    printf("\n清空棧!\n");
    Traverse(& stack1);

    return 0;
}


/*

        MyStock.h 頭文件定義和聲明

*/

#ifndef MYSTOCK_H_INCLUDED
#define MYSTOCK_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


typedef struct _element
{
    int date;
    struct Element * PNext;
}* PElement, Element;


typedef struct _mystack
{
    PElement PTop;
    PElement PBottom;
}* PMyStack, MyStack;


void InitStack(PMyStack);   //生成一個棧 使PTop和PBottom指向同一個只用來存放地址的節點
bool PushStack(PMyStack, int);
void Traverse(PMyStack);
bool PopStack(PMyStack, int *);//出棧 並返回這個值
void ClearStack(PMyStack);//清空棧
bool EmptyStack(PMyStack);


#endif // MYSTOCK_H_INCLUDED


/*

       MyStock.c 函數實現文件

*/

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "MyStock.h"


void InitStack(PMyStack PStack)//創建一個棧
{
    PStack->PTop = (PElement)malloc(sizeof(Element));
    if(NULL == PStack->PTop)
    {
        printf("\nPStack->PTop內存分配失敗!\n");
        exit(-1);
    }
    else
    {
        PStack->PBottom = PStack->PTop;//初始化的時候,PStack->PBottom = PStack->PTop共同指向一個空的區域
        PStack->PBottom->PNext = NULL;
    }


    return;
}


bool PushStack(PMyStack PStack, int val)//壓棧
{
    PElement PNew = (PElement)malloc(sizeof(Element));//新建的一個棧的節點
    PNew->date = val;
    PNew->PNext = PStack->PTop;//棧的Top指向最上面一個節點
    PStack->PTop = PNew;//說PTop指向最上面的節點,即PTop存儲的是PNew的指針


    return true;
}


/*------------------------錯--------------------------
bool PushStack(PMyStack PStack, int val)//壓棧
{
    PElement PHead = (PElement)malloc(sizeof(Element));
    PHead = NULL;
    PElement PNew = (PElement)malloc(sizeof(Element));//新建的一個棧中節點
    PNew->date = val;
    PStack->PTop->PNext = PNew;
    PNew->PNext = PHead;
    PStack->PBottom->PNext = PHead;


    return;
}
------------------------錯---------------------------*/


void Traverse(PMyStack PStack)//遍歷棧中的所有元素數據域
{
    PElement PTem = PStack->PTop;
    printf("\n");
    while(PTem != PStack->PBottom)
    {
        printf("%d\t", PTem->date);
        PTem = PTem->PNext;
    }


    return;
}


bool EmptyStack(PMyStack PStack)
{
    if(PStack->PBottom == PStack->PTop){
        return true;
    }
    return false;
}


bool PopStack(PMyStack PStack, int * Value)//出棧一次,並返回出棧的值
{
    if(PStack->PBottom == PStack->PTop){
        return false;
    }
    else
    {
        PElement PTem = PStack->PTop;
        PStack->PTop = PStack->PTop->PNext;
        printf("\n出棧的數是:%d\n", PTem->date);\
        free(PTem);


        return true;
    }
}


void ClearStack(PMyStack PStack)//清空所有的元素
{
    if(EmptyStack(PStack)){
        return;
    }
    else
    {
        PElement PTem1 = PStack->PTop;//頭指針
        PElement PTem2 = NULL;//第一個節點的指針


        while(PTem1 != PStack->PBottom)
        {
            PTem2 = PTem1->PNext;
            free(PTem1);
            PTem1 = PTem2;
        }
        PStack->PTop = PStack->PBottom;
        return;
    }


}















































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章