1. 程式人生 > >C語言 實現 連結串列棧

C語言 實現 連結串列棧

LinkStack.h 標頭檔案宣告如下:

#include <stdio.h>

typedef int DataType;               //自定義資料型別,假定為整型

struct Node;                        //單鏈表結點型別
typedef struct Node *PNode;         //結點指標型別

typedef struct Node                 //單鏈表結點結構
{   
    DataType info;                  //結點資料域
    PNode link;                     //結點指標域
}Node;

typedef struct LinkStack           //連結串列棧定義
{
    PNode top;        //棧頂指標
}LinkStack;

typedef struct LinkStack * PLinkStack;    //連結串列棧的指標型別

//建立一個空棧
PLinkStack createEmptyStack( void );

//判斷棧是否為空棧
int isEmptyStack(PLinkStack stack);

//進棧,成功返回1,失敗返回0
int push(PLinkStack stack,DataType x);

//出棧,成功返回1,失敗返回0
int pop(PLinkStack stack);

//取棧頂元素
DataType getTop(PLinkStack stack);

//顯示棧內所有元素 
void showStack(PLinkStack stack);

//把棧置空
void setEmpty(PLinkStack stack);

//把棧銷燬
void destroyStack(PLinkStack stack);

LinkStack.cpp 使用連結串列實現棧的基本操作,程式碼如下:

#include <stdio.h>
#include <malloc.h>
#include "LinkStack.h"

//建立一個的空棧
PLinkStack createEmptyStack(void)
{
    PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack));
    if(stack == NULL)
        printf("儲存分配失敗,請重建棧!\n");
    else
        stack->top=NULL;
    return stack;   
}

//判斷棧是否為空棧
int isEmptyStack(PLinkStack stack)
{
    return (stack->top == NULL);
}


//進棧,成功返回1,失敗返回0
int push(PLinkStack stack,DataType x)
{
    PNode p =(PNode)malloc(sizeof(struct Node));
    if(p == NULL )  
    {
        printf("新結點分配記憶體失敗,進棧失敗,請重試!\n");
        return 0;
    }
    else
    {
        p->info = x;
        p->link=stack->top;     //替換棧頂元素
        stack->top=p;
        return 1;
    }
}

//出棧,成功返回1,失敗返回0
int pop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("棧為空!\n");
        return 0;
    }
    else
    {
        PNode p;
        p=stack->top;   //刪除最後一個結點
        stack->top = stack->top->link;
        free(p);
        return 1;
    }
}

//取棧頂元素
DataType getTop(PLinkStack stack)
{
    if(isEmptyStack(stack))
    {
        printf("棧為空!取棧頂元素失敗!\n");
        return NULL;
    }
    return (stack->top->info);
}


//顯示棧內所有元素 
void showStack(PLinkStack stack)
{
    if(isEmptyStack(stack))
        printf("當前棧為空!無內容可顯示。\n");
    else
    {
        PNode p;
        p=stack->top;
        printf("頂--> ");
        while(p->link != NULL)
        {
            printf("%d ",p->info);
            p=p->link;
        }
        printf("%d ",p->info);  //顯示最後一個元素
        printf("-->底\n");
    }
}

//把棧置空
void setEmpty(PLinkStack stack)
{
    stack->top=NULL;
}

//把棧銷燬
void destroyStack(PLinkStack stack)
{
    if(stack)
    {
        stack->top=NULL;
        free(stack);
    }
}

main.cpp 檔案實現main函式對鏈棧進行呼叫操作:

#define _CRT_SECURE_NO_DEPRECATE    //解決在VS環境裡出現的警告問題
#include <stdio.h>
#include "LinkStack.h"

int main( )
{
    char input;
    DataType data;
    PLinkStack stack;
    do
    {
        printf("---------------------------------------------\n");
        printf("---------------------------------------------\n");
        printf("----       輸入對應字元執行以下操作      ----\n");
        printf("----                                     ----\n");
        printf("----         \"0\":建立一個空棧           ----\n");
        printf("----         \"1\":檢查棧是否為空         ----\n");
        printf("----         \"3\":執行入棧操作           ----\n");
        printf("----         \"4\":執行出棧操作           ----\n");
        printf("----         \"5\":列印棧頂元素           ----\n");
        printf("----         \"6\":列印棧內所有元素       ----\n");
        printf("----         \"7\":把棧清空               ----\n");
        printf("----         \"8\":把棧銷燬               ----\n");
        printf("----         \"q\":退出程式               ----\n");
        printf("---------------------------------------------\n");
        printf("---------------------------------------------\n");
        printf("選擇操作:");
        scanf("%c",&input);
        
        switch(input)
        {
            case '0':
                stack=createEmptyStack();
                printf("成功建立連結串列棧。\n");
                break;
                
             case '1':
                if(isEmptyStack(stack))
                    printf("該棧當前為空棧!\n");
                else
                    printf("該棧當前不為空棧!\n");
                break;
                     
            case '3':
                fflush(stdin);
                printf("請輸入要入棧的值:");
                scanf("%d",&data);
                if( push(stack,data))
                {
                    printf("入棧成功,棧當前內容:");
                    showStack(stack);
                }
                else
                {
                    printf("入棧失敗,請檢查!\n");
                }
                break;
                
            case '4':
                if( pop(stack))
                {
                    printf("出棧成功,棧當前內容:");
                    showStack(stack);
                }
                else
                {
                    printf("出棧失敗,請檢查!\n");
                }
                break;
                
             case '5':
                data=getTop(stack);
                printf("棧頂值為:%d\n",data);
                break;
                
             case '6':
                printf("棧當前內容:");
                showStack(stack);
                break;               
                
             case '7':
                setEmpty(stack);
                printf("棧當前內容:");
                showStack(stack);
                break;
                
             case '8':
                destroyStack(stack);
                printf("成功將棧銷燬!\n");
                break;
             
            default:
                break;
        }
        printf("\n");
        fflush(stdin);   /*清空緩衝區,也可以使用rewind(stdin);*/
    }while( input != 'q' );
    
    return 0;
}