天天看點

第六周項目二資料結構之自建算法庫——鍊棧

/*   
* Copyright (c) 2015, 煙台大學計算機與控制工程學院   
* All rights reserved.   
* 檔案名稱: listack.cpp,main.cpp,listack.h   
* 作者:鞏凱強   
* 完成日期:2015年10月5日   
* 版本号:codeblocks   
*   
* 問題描述:建立鍊棧算法庫程式的多檔案組織 
* 輸入描述:無   
* 程式輸出:運作的結果。   
*/     
#ifndef LISTACK_H_INCLUDED
#define LISTACK_H_INCLUDED
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct linknode
{
    ElemType data;              //資料域
    struct linknode *next;      //指針域
} LiStack;                      //鍊棧類型定義

void InitStack(LiStack *&s);  //初始化棧
void DestroyStack(LiStack *&s);  //銷毀棧
int StackLength(LiStack *s);  //傳回棧長度
bool StackEmpty(LiStack *s);  //判斷棧是否為空
void Push(LiStack *&s,ElemType e);  //入棧
bool Pop(LiStack *&s,ElemType &e);  //出棧
bool GetTop(LiStack *s,ElemType &e);  //取棧頂元素
void DispStack(LiStack *s);  //輸出棧中元素
#endif // LISTACK_H_INCLUDED

#include "listack.h"

void InitStack(LiStack *&s)  //初始化棧
{
    s=(LiStack *)malloc(sizeof(LiStack));
    s->next=NULL;
}

void DestroyStack(LiStack *&s)  //銷毀棧
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        free(s);
        s=p;
        p=p->next;
    }
    free(s);    //s指向尾結點,釋放其空間
}

int StackLength(LiStack *s)  //傳回棧長度
{
    int i=0;
    LiStack *p;
    p=s->next;
    while (p!=NULL)
    {
        i++;
        p=p->next;
    }
    return(i);
}

bool StackEmpty(LiStack *s)  //判斷棧是否為空
{
    return(s->next==NULL);
}

void Push(LiStack *&s,ElemType e)  //入棧
{
    LiStack *p;
    p=(LiStack *)malloc(sizeof(LiStack));
    p->data=e;              //建立元素e對應的節點*p
    p->next=s->next;        //插入*p節點作為開始節點
    s->next=p;
}

bool Pop(LiStack *&s,ElemType &e)  //出棧
{
    LiStack *p;
    if (s->next==NULL)      //棧空的情況
        return false;
    p=s->next;              //p指向開始節點
    e=p->data;
    s->next=p->next;        //删除*p節點
    free(p);                //釋放*p節點
    return true;
}

bool GetTop(LiStack *s,ElemType &e)  //取棧頂元素
{
    if (s->next==NULL)      //棧空的情況
        return false;
    e=s->next->data;
    return true;
}

void DispStack(LiStack *s)  //輸出棧中元素
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}

#include "listack.h"
int main()
{
    ElemType e;
    LiStack *s;
    printf("(1)初始化鍊棧s\n");
    InitStack(s);
    printf("(2)鍊棧為%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(3)依次進鍊棧元素a,b,c,d,e\n");
    Push(s,'a');
    Push(s,'b');
    Push(s,'c');
    Push(s,'d');
    Push(s,'e');
    printf("(4)鍊棧為%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(5)鍊棧長度:%d\n",StackLength(s));
    printf("(6)從鍊棧頂到鍊棧底元素:");DispStack(s);
    printf("(7)對外連結棧序列:");
    while (!StackEmpty(s))
    {   Pop(s,e);
        printf("%c ",e);
    }
    printf("\n");
    printf("(8)鍊棧為%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(9)釋放鍊棧\n");
    DestroyStack(s);
    return 0;
}
           

運作結果:

第六周項目二資料結構之自建算法庫——鍊棧

知識點總結:

用連結清單的功能實作鍊棧的功能。

學習心得:

複習了連結清單的知識,同時也學習了鍊棧的建立。

繼續閱讀