第六週實踐項目2--建立鏈棧的算法庫

問題及代碼:

/*      
Copyright (c)2015,煙臺大學計算機與控制工程學院      
All rights reserved.      
文件名稱:第6周項目2--建立鏈棧算法庫.cpp      
作    者:朱振華      
完成日期:2015年10月9日      
版 本 號:v1.0      
      
問題描述:定義鏈棧存儲結構,實現其基本運算,並完成測試。 
輸入描述:若干數據。
程序輸出:各個步驟的文字敘述及其數據的輸出。
*/


1.頭文件:

#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);  //輸出棧中元素


2.源文件:

#include"head.h"
void InitStack(LiStack *&s)
{
    s=(LiStack *)malloc(sizeof(LiStack));
    s->next=NULL;
}


void DestroyStack(LiStack *&s)
{
    free(s);
}
int StackLength(LiStack *s)
{
    int i=0;
    s=s->next;
    while(s!=NULL)
    {
        i++;
        s=s->next;
    }
    return i;
}
bool StackEmpty(LiStack *s)
{
    if(s->next==NULL)
    {
        return true;
    }
    else return false;
}
void Push(LiStack *&s,ElemType e)
{
    LiStack *l;
    l=(LiStack *)malloc(sizeof(LiStack));
    l->data=e;
    l->next=s->next;
    s->next=l;
}
bool Pop(LiStack *&s,ElemType &e)
{
    LiStack *l;
    l=s;
    if(l->next==NULL)
    {
        return false;
    }
    l=s->next;
    e=l->data;
    s->next=l->next;
    free(l);
    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 *l;
    l=s;
    l=l->next;
    while(l!=NULL)
    {
        printf("%c",l->data);
        l=l->next;
    }
    printf("\n");


}


3.main函數:

#include"head.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;
}


運行結果:



心得體會:

       這是鏈棧,與順序棧同爲棧的基本。與順序棧相比,因爲是動態存儲,所以鏈棧的優點是通常不會出現棧滿。



發佈了57 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章