棧(Stack)的編程實現

抽象數據類型棧的定義

這裏寫圖片描述

棧的表示和實現

這裏寫圖片描述
這裏寫圖片描述

出棧進棧過程

這裏寫圖片描述
這裏寫圖片描述

程序實現

/***************************************************** 
Description:
       順序棧的實現
*****************************************************/

#include <stdio.h>
#include <stdlib.h>

#define Max 10

struct stack_data
{
    int stack[Max];
    int top;
};

typedef struct stack_data Stack;

enum return_value{FULL_OK,FULL_ON,PUSH_ERROR,PUSH_OK,POP_NO = 20,EMPTY,EMPTY_NO};

void creat_stack(Stack ** stack)
{
    *stack = (Stack *)malloc(sizeof(Stack));
    if(*stack == NULL)
    {
        printf("creat stack failed !\n");
        exit(-1);
    }
}

void init_stack(Stack ** stack)
{
    (*stack) -> top = -1;
}

int is_full(Stack ** stack)
{
    if((*stack)->top == Max)
    {
        return FULL_OK;
    }
    return FULL_ON;
}

int is_empty(Stack ** stack)
{
    if((*stack)->top == -1)
    {
        return EMPTY;
    }
    return  EMPTY_NO;
}

int push_stack(Stack ** stack,int num)
{
    //判斷棧是否爲滿
    if(is_full(stack) == FULL_OK)
    {
        printf("the stack is full\n");
        return PUSH_ERROR;
    }
    //移動棧定指針
    ((*stack) -> top)++;
    //壓入數據
    ((*stack) -> stack[(*stack)->top]) = num;

    return PUSH_OK;
}


int pop_stack(Stack ** stack)
{
    if(is_empty(stack) == EMPTY)
    {
        printf("the stack is empty\n");
        return ;
    }

    return ((*stack)->stack[((*stack)->top)--]);
}

int main()
{   
    int i;
    int ret;
    Stack * stack = NULL;
    //創建棧
    creat_stack(&stack);
    //初始化棧
    init_stack(&stack);
    //壓棧
    for(i = 0; i < Max; i++)
    {
        if(push_stack(&stack,i+1) == PUSH_OK)
        {
            printf("push ok\n");
        }
    }
    //出棧
    for(i = 0; i < Max; i++)
    {
        ret = pop_stack(&stack);
        if(ret == POP_NO)
        {
            break;
        }
        printf("第%2d次出棧值:%3d\n",i+1,ret);
    }

    return PUSH_OK;
}
/*****************************************************
Description:
        鏈式棧實現
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#define MAX  100

struct stack_data
{
    int stack;
    struct stack_data * next;
};

typedef struct stack_data    Stack;
typedef struct stack_data *  Link; 

enum return_value {FULL_OK,FULL_NO,EMPTY_OK,EMPTY_NO,PUSH_OK};

void create_stack(Stack ** stack)
{
    *stack = (Stack *)malloc(sizeof(Stack));
    if( *stack == NULL)
    {
        printf("creat stack fail \n");
        exit(-1);
    }
}

void init_stack(Stack * stack)
{
    stack -> next = NULL;
}

int is_empty(Stack * stack)
{
    if(stack->next == NULL)
    {
        return EMPTY_OK;
    }
    return EMPTY_NO;
}

int push_stack(Stack * stack,Stack * new_node,int num)
{
    Link temp = stack;

    new_node->stack = num;

    while(temp->next != NULL)
    {
        temp = temp->next;
    }

    temp->next = new_node;

    new_node->next = NULL;

    return PUSH_OK;
}

int pop_stack(Stack * stack)
{
    Link temp = stack;
    Link p    = temp;
    int num;
    if (is_empty(stack) == EMPTY_OK )
    {
        printf("the stack is empty");
        exit(-1);
    }

    while(temp->next != NULL)
    {
        p = temp;
        temp = temp->next;
    }
    p->next = NULL;
    num = temp -> stack;
    free(temp);
    temp = NULL;

    return num;
}

int main()
{
    Stack * stack;
    Stack * new_node;
    int i;
    int ret;
    //創建棧
    create_stack(&stack);
    //初始化棧
    init_stack(stack);

    for(i = 0; i< 10; i++)
    {
        //創建新節點
        create_stack(&new_node);
        //入棧(尾插形式)
        ret = push_stack(stack,new_node,i);

        if( ret == PUSH_OK)
        {
            printf("PUSH_OK\n");
        }
    }

    for(i = 0; i < 10; i++)
    {
        ret = pop_stack(stack);

        printf("第%d次出棧,出棧值 %d\n",i+1,ret);
    }

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