1. 程式人生 > >C語言實現順序棧的基本操作

C語言實現順序棧的基本操作

//標頭檔案內容
//--------------------棧的順序儲存結構--------------------

#define STACK_INIT_SIZE 100
#define STACKINCREACE 10
typedef int Elemtype;//在標頭檔案中說明
typedef int Status;
typedef struct{
    Elemtype *base;
    Elemtype *top;
    int stacksize;
}SqStack;

//----------------------函式宣告部分----------------------

Status InitStack(SqStack &S);
Status Push(SqStack &S,Elemtype e);
Status Pop(SqStack &S,Elemtype &e);
Status GetTop(SqStack S,Elemtype &e);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status StackTraverse(SqStack S);
Status ClearStack(SqStack &S);
Status DestroyStack(SqStack &S);

//------------------棧的初始化函式------------------

Status InitStack(SqStack &S){
    S.base = (Elemtype *)malloc(STACK_INIT_SIZE*sizeof(Elemtype));
    if(!S.base){
        return false;
    }
    S.stacksize=STACK_INIT_SIZE;
    S.top=S.base;
    return true;
}

//---------------------入棧函式---------------------

Status Push(SqStack &S,Elemtype e){
//判斷是否溢位
    if(S.top-S.base>=S.stacksize){        
        S.base=(Elemtype *)realloc(S.base,(S.stacksize+STACKINCREACE)*sizeof(Elemtype));
        if(!S.base){
            return false;
        }
        S.top=S.base+S.stacksize;//注意因為這裡的棧底指標的改變,導致棧頂指標隨之改變
        S.stacksize+=STACKINCREACE;
    }
//壓棧部分
    *S.top=e;
    S.top++;//棧頂指標加一 
    return true;
}

//---------------------出棧函式---------------------

Status Pop(SqStack &S,Elemtype &e){
//非法判斷
    if(S.base==S.top){
        return false;
    }
    S.top--;    //注意這裡因為top指向棧中當前元素的上一個空間,所以要先將其位置減一
    e=*S.top;
    return true;
    }
    
//-------------------檢視棧頂元素-------------------

Status GetTop(SqStack S,Elemtype &e){
    if(S.base==S.top ){
        return false;
    }
    e=*(S.top-1);
    return true;
}

//------------------判斷棧是否為空------------------

Status StackEmpty(SqStack S){
    if(S.base==S.top){
        return true;
    }
    return false;
}

//------------------返回棧元素個數------------------

int StackLength(SqStack S){
    if(S.base==S.top){
        return 0;
    }
    return S.top-S.base;
}

//--------------------遍歷棧------------------------

Status StackTraverse(SqStack S){//從棧底到棧頂的方向
    if(S.top==S.base){
        return false;
    }
    while(S.base <S.top ){
        printf("%d\t",*(S.base++));
    }
    printf("\n");
    return true;
}

//--------------------清空棧------------------------

Status ClearStack(SqStack &S){//清空棧的時候不用將stacksize重新賦值
    S.top=S.base;             //因為經過realloc函式重新分配空間後(stacksize大小改變),
    return true;            //S.base指向的是一段stacksize大小的連續儲存空間             
                            //即使將他重置,剩餘的空間也是閒置的(順序表裡也只是經當前長度置為0)             
    }
       
//--------------------銷燬棧------------------------

Status DestroyStack(SqStack &S){
    free(S.base);
    free(S.top);
    S.base=NULL;
    return true;
}




*********************************************主函式***********************************************

//原始檔內容
#include <stdio.h>
#include <stdlib.h>
#include "SqStackHeader.h"

//--------------------主函式入口--------------------

int main(){
    SqStack stack;
    int temp=1;
    int getElem=NULL;
    int popElem=NULL;
    
printf("\n--------------------棧的初始化--------------------\n");

    InitStack(stack);
    
printf("\n--------------------元素的入棧--------------------\n");

    Push(stack,temp);
    Push(stack,2);
    
printf("\n--------------------遍歷順序棧--------------------\n");

    printf("此時的棧元素有:\n"); 
    StackTraverse(stack);
    
printf("\n-------------------獲取棧頂元素-------------------\n");

    GetTop(stack,getElem);
    printf("棧頂元素是:%d\n",getElem);
    
printf("\n-------------------判斷是否為空-------------------\n");

    bool empty;
    empty=StackEmpty(stack);
    if(empty==true){
        printf("該棧是空棧\n");
    }
    else{
        printf("該棧不是空棧"); 
    } 
    
printf("\n--------------------彈棧測試----------------------\n");

    Pop(stack,popElem);
    printf("彈出的元素是:%d\n",popElem);
    
printf("\n------------------棧的清空及銷燬------------------\n");

//    ClearStack(stack);
//    DestroyStack(stack);

    printf("此時的棧元素有:\n"); 
    StackTraverse(stack);
printf("\n--------------------輸出棧長度--------------------\n");

    printf("棧的長度:%d\n",StackLength(stack));
    getchar();
    return 0;
}




相關推薦

C語言實現順序基本操作

//標頭檔案內容//--------------------棧的順序儲存結構-------------------- #define STACK_INIT_SIZE 100 #define STACKINCREACE 10 typedef int Elemtype;//在

c語言實現順序基本功能

#include<stdio.h> #include<stdlib.h> #define maxsize 100 typedef struct SqStack{ int data[maxsize]; int top; }SqStack,*pSqStac

C語言實現線性表基本操作

style eal struct fine fin delete class logs destroy #include <stdio.h> #include <tchar.h> #include <stdlib.h> #define

C語言實現順序的初始化&進&出&讀取頂元素

/*順序表實現棧的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //設棧中元素個數為50 #define OK 1 #define ERROR 0

C語言實現順序的括號匹配

//順序棧的使用舉例:括號的匹配 #include <stdio.h> #include <stdlib.h> #define OK      1 #define ERROR   0 #define TRUE    1 #define FALSE  

c語言實現基本功能

typedef struct node{ int data; node *next; }Node,*pNode; typedef struct{ pNode top; int count; }LinkStack,*pLinkStack; 注意:(1).首先定義節點結構體

c語言實現圖的基本操作--鄰接矩陣儲存

利用鄰接矩陣容易判定任意兩個頂點之間是否有邊(或弧)相連,並容易求得各個頂點的度。 c語言程式碼實現如下: #include<stdio.h> #include<stdlib.h> #define MAX_VER_NUM 50 typedef cha

C語言實現順序表的基本操作

1.定義 線性表的順序儲存是指在記憶體中用一組地址連續的儲存單元依次儲存線性表的各元素,用這種儲存形式儲存的線性表稱為順序表。也就是說,順序表以資料元素在計算機內的物理位置相鄰來表示資料元素線上性表中的邏輯相鄰關係。 2.線性表的順序儲存示意圖

C語言單鏈表及基本操作實現

        資料結構中,單向連結串列(又名單鏈表、線性連結串列)是連結串列的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要通過從頭部開始,依序往下讀取。         下面的程式碼是使用指標實現的

順序基本操作實現

首先,定義一個結構體,結構體中有一個指標data,順序棧的大小,還有一個capacuty,即相當於之前順序連結串列的Max_Size,表示data這段記憶體中能容納的元素個數,用於擴容。1.初始化:給data開闢記憶體空間,size設為0,capacity自定義一個值,這裡定

c語言順序實現

#include<iostream> #include<stdio.h> #include<math.h> #define STACK_INIT_SIZE 100 #define STACK_INCREMENT 10 using name

C語言實現順序佇列的初始化、入隊、出隊等操作(三)

佇列是一種只能在隊頭刪除、隊尾插入的線性表,本文實現佇列的順序結構,使用一個結構體包含隊頭指標、隊尾指標、佇列的長度這三個成員。通過malloc函式為佇列開闢一片記憶體,大小為100個單位(100*資料型別所佔位元組),將隊頭指標指向起始地址,隊尾指標也指向起始地址。佇列的

C語言 連結串列的基本操作實現 原始碼

1 創作初衷   作為一個畢業半年,到公司上班的菜鳥程式猿,卻還沒有參與過一次實際的專案開發,沒有跟著專案寫過一行程式碼, 每天除了自學,就是做做文件之類的工作。所以在此,把之前學過的知識重新拿起來,寫成文章。   本文屬於作者 原創,轉載請註明出處!哦,也許並沒有人能看上

C語言模擬順序的建立、入、出操作

#include<stdio.h> #include<stdlib.h> #define true 1 #define false 0 #define ok 1 #define error 0

[資料結構]c語言實現的入,出,清空,銷燬等操作

最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化

C語言_堆的基本操作

本片部落格主要包含一下幾個內容: 堆的基本操作 1、建立堆 2、調整堆(向下調整) 3、插入 4、移除堆頂元素 5、返回堆元素個數 6、判斷是不是空堆 7、返回堆頂元素 8、向上調整堆 9、交換兩個數 10、判斷堆是否已滿,如果滿了,就增容;如果沒有滿,就

C語言_佇列的基本操作

本片部落格主要內容: 建立新結點 初始化佇列 入佇列 出佇列 返回對頭元素 返回隊尾元素 計算佇列長度 判斷佇列是否為空,為空返回1,否則返回零 ###1、初始化佇列 void QueueInit (Queue* q) //初始化佇列 { QNode *cur =

C語言-二叉樹基本操作以及二叉搜尋樹基本操作

功能 二叉樹操作: 建立二叉樹 遍歷二叉樹(前序,中序,後續) 計算高度 計算結點數目 清空二叉樹 空樹判斷 二叉搜尋樹操作: 插入 最值(最大值,最小值) 刪除 程式碼 #include &l

C語言單向連結串列基本操作

資料結構練習 “` typedef struct node{ int data; struct node * next; } Node; void Create(Node**); void Output(Node*); No

C語言單鏈表的基本操作總結

刷LeedCode時使用單鏈表頻出錯誤,於是花時間總結了一下單鏈表的基本操作,把所寫程式碼和詳細註釋貼在這裡,以備後用。 #include <stdio.h> #include <stdlib.h> /*定義結構體連結串列節點: 該結構體有兩個屬性,一個是int型