程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> 棧的c語言實現

棧的c語言實現

編輯:C語言入門知識

棧的基本概念

棧是限定僅在表尾進行插入或刪除的操作.因此,對於棧來說,表尾端有其特殊的含義,稱為棧頂(top),相應的表頭端稱為棧底(bottom).不含元素的空表稱為空棧.
棧的修改是按照後進先出的原則進行的,又成為LIFO結構.插入元素的操作稱為入棧,刪除棧頂元素的操作成為出棧.

棧的基本操作有:

插入 刪除 初始化 判空 取棧頂元素 清除棧 銷毀棧 遍歷棧 棧的長度

棧的表示和實現

棧有兩種表示方式:

1. 順序棧

使用一組連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針top指示棧頂元素在順序棧中的位置.
一般實現方法:
    先為 棧分配一個基本容量,然後在應用過程中,當棧的空間不夠使用時在逐段增大.
    順序棧的定義如下:
    typedef struct{
        SElemType *base;
        SElemType *top;
        int stacksize;
    }
其中stacksize指示棧的當前可使用的最大容量,base稱為棧底指針,始終指向棧底位置.top為棧頂指針,當top=base時,棧為空.當base=NULL時,棧結構不存在.

2. 鏈式棧

鏈式棧就是一個特殊的只能對第一個結點進行操作的單鏈表.這裡不在做過多的論述

代碼實現

順序棧

基本上參考嚴蔚敏老師的《數據結構》(c語言版)代碼實現

/* 接口的定義文件 */
/* stack 順序存儲的結構定義和接口聲明 */

/* 存儲空間的初始分配量 */
#define STACK_INIT_SIZE 100
/* 存儲空間分配增量 */
#define STACKINCREMENT 10

#define true 1
#define false 0



/* 定義數據類型 */
typedef int datatype;

/* 棧的數據結構定義 */
typedef struct{
    /* 在構造之前和銷毀之後base的值為NULL */
    datatype *base;
    /* 棧頂指針 */
    datatype *top;
    /* 當前已分配的存儲空間 */
    int stacksize;
}stack,*sp_stack;

/* 基本操作的函數原型說明 */

/* 構造一個空棧s */
sp_stack stack_init(sp_stack s);

/* 銷毀棧s,s不再存在 */
void stack_destroy(sp_stack s);

/* 置棧為空 */
void stack_clear(sp_stack s);

/* 判斷棧是否為空
 * 若為空,返回true
 * 否則返回false
*/
int stack_empty(sp_stack s);


/* 返回棧中元素的個數 */
int stack_length(sp_stack s);

/* 若棧不空
 * 用e返回s的棧頂元素,並返回true
 * 否則返回false
*/
int get_top(sp_stack s, datatype *e);


/* 插入元素e為新的棧頂元素 */
void push(sp_stack s, datatype e);

/* 若棧不空
 * 刪除棧頂元素,用e返回其值,並返回true
 * 否則返回false
*/
int pop(sp_stack s, datatype *e);



/* 從棧底到棧頂依次對棧中每個元素調用visit()函數.
 * 一旦visit()失敗,則操作失敗
*/
 void stack_traverse(sp_stack s, void(*visit)(sp_stack));

/* 遍歷處理函數 */
void visit(sp_stack s);

 /* 接口的實現文件 */
 #include
#include
#include"sp_stack.h"



sp_stack stack_init(sp_stack s)
{
    /* 申請內存空間 */
    s -> base = (datatype *)malloc(sizeof(datatype) * STACK_INIT_SIZE);
    /* 申請內存失敗 */
    if (!s -> base)
        exit(0);
    s -> stacksize = STACK_INIT_SIZE;
    s -> top = s -> base;
    return s;
}


void stack_destory(sp_stack s)
{
    free(s -> base);
    free(s);
    s = NULL;
}



void stack_clear(sp_stack s)
{
    s -> top = s -> base;
}


int stack_length(sp_stack s)
{
    int l = s -> top - s -> base;
    return l;
}


int get_top(sp_stack s, datatype *e)
{
    if (s -> top == s -> base)
        return false;
    *e = *(s -> top);
    return true;
}

void push(sp_stack s, datatype e)
{
    /* 內存已滿 */
    if ( (s -> top - s -> base) >= s -> stacksize)
    {
        s -> base = (datatype *) realloc(s -> base, (s -> stacksize + STACKINCREMENT) * sizeof(datatype));
        /* 申請內存失敗 */
        if (!s -> base)
            exit(0);
        s -> top = s -> base + s -> stacksize;
        s -> stacksize = s -> stacksize + STACKINCREMENT;

    }
    s -> top = s -> top + 1;
    *s -> top = e;
}


int pop(sp_stack s, datatype *e)
{
    /* 棧為空 */
    if(s -> top == s -> base)
        return false;
    *e = *s -> top;
    s -> top = s -> top - 1;
    return true;
}


void stack_traverse(sp_stack s, void (*visit)(sp_stack s))
{
    visit(s);
}


void visit(sp_stack s)
{
    datatype *temp = s -> base + 1;
    while(true)
    {
        if(temp <= s -> top)
        {
            printf("%d ", *temp);
            temp = temp + 1;
        }
        else
        {
            printf("\n");
            break;
        }
    }

}



int main()
{
    sp_stack s = (sp_stack)malloc(sizeof(stack));
    s = stack_init(s);
    printf("length:%d\n", stack_length(s));
    push(s, 1);
    printf("length:%d\n", stack_length(s));
    push(s, 2);
    printf("length:%d\n", stack_length(s));
    push(s, 3);
    printf("length:%d\n", stack_length(s));
    stack_traverse(s, visit);
    datatype *e;
    get_top(s, e);
    printf("get_top:%d\n", *e);
    stack_traverse(s, visit);   
    pop(s, e);
    printf("pop:%d\n", *e);
    stack_clear(s);
    printf("length:%d\n", stack_length(s));
    stack_traverse(s, visit);
}

鏈式棧

參考嚴蔚敏老師的《數據結構》(c語言版)的接口,接口的實現有自己完成。

/* 接口的定義文件 */
/* stack 鏈式存儲的結構定義和接口聲明 */


#define true 1
#define false 0



/* 定義數據類型 */
typedef int datatype;

/* 棧的數據結構定義 */
typedef struct stack{
    /* 數據域 */
    datatype data;
    /* 指針域 */
    struct stack *next;
}stack,*lp_stack;

/* 基本操作的函數原型說明 */

/* 構造一個空棧s */
lp_stack stack_init(lp_stack s);

/* 銷毀棧s,s不再存在 */
void stack_destroy(lp_stack s);

/* 置棧為空 */
void stack_clear(lp_stack s);

/* 判斷棧是否為空
 * 若為空,返回true
 * 否則返回false
*/
int stack_empty(lp_stack s);


/* 返回棧中元素的個數 */
int stack_length(lp_stack s);

/* 若棧不空
 * 用e返回s的棧頂元素,並返回true
 * 否則返回false
*/
int get_top(lp_stack s, datatype *e);


/* 插入元素e為新的棧頂元素 */
void push(lp_stack s, datatype e);

/* 若棧不空
 * 刪除棧頂元素,用e返回其值,並返回true
 * 否則返回false
*/
int pop(lp_stack s, datatype *e);



/* 從棧底到棧頂依次對棧中每個元素調用visit()函數.
 * 一旦visit()失敗,則操作失敗
*/
 void stack_traverse(lp_stack s, void(*visit)(lp_stack));

/* 遍歷處理函數 */
void visit(lp_stack s);


/* 接口的實現文件 */
#include
#include
#include"lp_stack.h"



lp_stack stack_init(lp_stack s)
{

    s -> next = NULL;
    return s;
}


void stack_destroy(lp_stack s)
{
    lp_stack temp = s;
    while(s)
    {
        s = s -> next;
        free(temp);
        temp = s;
    }
}



void stack_clear(lp_stack s)
{
    lp_stack temp = s -> next;
    while(s -> next)
    {
        s -> next = s -> next -> next;
        free(temp);
        temp = s -> next;
    }
}


int stack_empty(lp_stack s)
{
    if(s -> next = NULL)
        return true;
    return false;

}


int stack_length(lp_stack s)
{
    /* 棧的當前結點 */
    lp_stack top = s -> next;
    /* 計數器 */
    int count = 0;
    while(top)
    {
        count += 1;
        top = top -> next;
    }
    return count;
}

int get_top(lp_stack s, datatype *e)
{
    if (s -> next == NULL)
        return false;
    *e = s -> next -> data;
    return true;
}

void push(lp_stack s, datatype e)
{
    lp_stack new_node = (lp_stack)malloc(sizeof(stack));
    new_node -> data = e;
    new_node -> next = s -> next;
    s -> next = new_node;
}


int pop(lp_stack s, datatype *e)
{
    if(s -> next == NULL)
        return false;
    *e = s -> next -> data;
    lp_stack node = s -> next;
    s -> next = s -> next -> next;
    free(node);
    return true;
}

void stack_traverse(lp_stack s, void (*visit)(lp_stack))
{
    visit(s);
}


void visit(lp_stack s)
{
    lp_stack node = s -> next;
    while(node)
    {
        printf("%d ",node -> data);
        node = node -> next;
    }
}

int main()
{
    lp_stack s = (lp_stack)malloc(sizeof(stack));
    s = stack_init(s);
    printf("length:%d\n", stack_length(s));
    push(s, 1);
    printf("length:%d\n", stack_length(s));
    push(s, 2);
    printf("length:%d\n", stack_length(s));
    push(s, 3);
    printf("length:%d\n", stack_length(s));
    stack_traverse(s, visit);
    datatype *e;
    get_top(s, e);
    printf("get_top:%d\n", *e);
    stack_traverse(s, visit);   
    pop(s, e);
    printf("pop:%d\n", *e);
    stack_traverse(s, visit);
    stack_clear(s);
    printf("length:%d\n", stack_length(s));
    stack_traverse(s, visit);
}    
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved