棧的鏈式實現

主要代碼:

/****************************************************
  @title: 數據結構實驗
  @name: <實驗3-1> 棧的鏈式存儲結構 
  @object:
      [實驗目的]
          採用鏈式存儲結構實現棧的基本操作 
      [實驗提示]
          1. 在stack.h中實現棧的基本操作, 
             在鏈式存儲結構中可是省去頭結點。
          2. 在dsp0301.cpp中編寫適當的代碼,進行測試
  @include:
      stack.h [*]
          棧的鏈式實現 
  @usage:
      請查看"TO-DO列表",根據要求完成代碼
  @copyright: BTC 2004, Zhuang Bo
  @author: Zhuang Bo
  @date: 2004
  @description:
*****************************************************/

#include <stdio.h>
#include <stdlib.h> //for system()
#include "stack.h" //鏈棧 

//測試鏈棧的主程序
int main()
{
    LinkStack s;
    int x;
    //輸入若干正整數以0結束,依次入棧,然後依次出棧並打印
    InitStack(s);

    printf("輸入若干正整數以0結束:");
    scanf("%d",&x);
    while(x!=0) {
        Push(s,x);
        scanf("%d",&x);
    }
    int y;
    printf("\n棧頂的元素爲:%d",GetTop(s,y));
    printf("\n現在棧中的元素個數:%d",StackLength(s));
    Pop(s,x);
    printf("\n刪除成功,刪除元素爲:%d",x);
    printf("\n現在棧中的元素個數:%d",StackLength(s));
    printf("\n現在棧中的元素");
    printf("\n出棧結果:");
    while(!StackEmpty(s)) {
        Pop(s,x);
        printf("%4d",x);
    }
    printf("\n現在棧中的元素個數:%d",StackLength(s));
    //-------------------------------------
    // TODO (#1#): 其它測試程序 
    //-------------------------------------
    DestroyStack(s); //銷燬棧 

    system("PAUSE");    
    return 0;
}
/*
  Name: 棧的鏈式實現 
  Copyright: 
  Author: 
  Date: 
  Description: 
*/

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

#include "ds.h" //for Status,OK ...

#ifndef ElemType
#define ElemType int /* 數據元素類型默認爲 int */
#define ELEMTYPE_TAG
#endif


///////////////////////////////////////////////////////////
//鏈棧的存儲結構定義 
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

typedef LinkList LinkStack; //鏈棧類型 

///////////////////////////////////////////////////////////
//鏈棧的基本操作聲明

//構造一個空棧S 
Status InitStack(LinkStack &S);
//銷燬棧S 
Status DestroyStack(LinkStack &S);
//將棧S清空 
Status ClearStack(LinkStack &S);
//若棧S爲空返回TRUE,否則FALSE 
Status StackEmpty(LinkStack S);
//返回棧S中的元素個數
int    StackLength(LinkStack S);
//用e返回棧頂元素
//    前提:棧S存在且不空 
Status GetTop(LinkStack S, ElemType &e);
//元素e入棧S 
Status Push(LinkStack &S, ElemType e);
//S出棧用e返回出棧元素 
//    前提:棧S存在且不空 
Status Pop(LinkStack &S, ElemType &e);

///////////////////////////////////////////////////////////
//鏈棧的基本操作的實現

//構造一個空棧S 
Status InitStack(LinkStack &S)
{
    // TODO (#1#): 構造一個空棧S,不帶頭結點 
    S=(LinkStack)malloc(sizeof(LNode));
    if(!S){
        exit(0);
    }
    S->next=NULL;
    return OK;
    //-------------------------------------
}

//銷燬棧S 
Status DestroyStack(LinkStack &S)
{
    // TODO (#1#):銷燬棧S,相當於清空棧 
    LinkStack p;
    while(S->next){
        p=S->next;
        S->next=p->next;
        free(p);
    }

    return ERROR;
    //-------------------------------------
}

//將棧S清空 
Status ClearStack(LinkStack &S)
{
    // TODO (#1#): 將棧S清空,釋放所有結點

    S->next=NULL;
    return OK;
    //-------------------------------------
}

//若棧S爲空返回TRUE,否則FALSE 
Status StackEmpty(LinkStack S)
{
    // TODO (#1#): 若棧S爲空返回TRUE,否則FALSE
    if(!S->next){
        return TRUE;
    }
    return FALSE;
    //-------------------------------------
}

//返回棧S中的元素個數
int  StackLength(LinkStack S)
{
    LinkStack p;
    // TODO (#1#): 返回棧S中的元素個數
    int j=0;//計數器
    p=S;
    while(p->next){
        j++;
        p=p->next;
    }
    return j;
    //-------------------------------------
}

//用e返回棧頂元素
//    前提:棧S存在且不空 
Status GetTop(LinkStack S, ElemType &e)
{
    // TODO (#1#):若棧S不空,則用e返回棧頂元素
    if(!S){
        return ERROR;
    }
    e=S->data;
    return e;
    //-------------------------------------
}

//元素e入棧S 
Status Push(LinkStack &S, ElemType e)
{
    // TODO (#1#): 插入元素e作爲新的棧頂 
    LinkStack p=(LinkStack)malloc(sizeof(LNode));
    p->data=e;
    p->next=S;
    S=p;
    return OK;
    //-------------------------------------
}

//S出棧用e返回出棧元素 
//    前提:棧S存在且不空 
Status Pop(LinkStack &S, ElemType &e)
{
    LinkStack p;
    // TODO (#1#):若棧S不空,則刪除棧頂元素用e返回 
    if(!S){
        return ERROR;
    }
    e=S->data;
    p=S;
    S=S->next;
    free(p);
    return OK;
    //-------------------------------------
}


#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif

#endif

演示結果:

這裏寫圖片描述

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