栈的动态顺序存储和实现(C语言)【栈】(7)
生活随笔
收集整理的這篇文章主要介紹了
栈的动态顺序存储和实现(C语言)【栈】(7)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- ElemType.h
- SqStack.h
- ElemType.cpp
- SqStack.cpp
- main.cpp
- 測試結果
ElemType.h
#pragma once//ElemType 的定義 typedef int ElemType;int compare(ElemType x, ElemType y); void visit(ElemType e);SqStack.h
#pragma once #include "ElemType.h"//棧結構的定義typedef struct _Stack {ElemType* base; //棧基地址ElemType* top; //棧頂int stacksize; //棧空間的尺寸 }SqStack, *SqStackPtr;//棧的基本操作 void InitStack(SqStackPtr Stack); //初始化 void DestroyStack(SqStackPtr Stack); //銷毀 void ClearDtack(SqStackPtr Stack); //清空 bool IsStackEmpty(SqStack Stack); //判空 int StackLength(SqStack Stack); //求長度 bool GetTop(SqStack Stack, ElemType* e); //獲得棧頂元素 void StackTraverse(SqStack Stack,void(*fp)(ElemType)); //遍歷棧中的數據元素 bool Push(SqStackPtr Stack, ElemType e); //壓棧 bool Pop(SqStackPtr Stack, ElemType* e); //出棧ElemType.cpp
#include "ElemType.h" #include <stdio.h>//ElemType 的實現int compare(ElemType x, ElemType y) {return (x - y); } void visit(ElemType e) {printf("%d\t", e); }SqStack.cpp
#include "ElemType.h" #include "SqStack.h" #include <stdio.h> #include <assert.h> #include <malloc.h> #include <stdlib.h> const int STACK_INIT_SIZE = 100; //初始分派的長度 const int STACK_ADD_SIZE = 20; //占內存空間的增量/* ------------------------------------------------------------ 操作目的: 初始化棧 初始條件: 無 操作結果: 構造一個空棧 函數參數: SqStackPtr Stack 待初始化的棧 返回值: bool 操作是否成功 ------------------------------------------------------------*/void InitStack(SqStackPtr Stack) {assert(Stack != NULL);if (NULL == Stack){printf("%d-->%s error", __LINE__, __FILE__);exit(-1);}Stack->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if (!Stack->base){printf("InitStack Apply Fail\n");exit(-1);}Stack->top = Stack->base;Stack->stacksize = STACK_INIT_SIZE; }/* ------------------------------------------------------------ 操作目的: 銷毀棧 初始條件: 棧Stack已經存在 操作結果: 銷毀棧Stack 函數參數: SqStackPtr Stack 待銷毀的棧 返回值:無 ------------------------------------------------------------*/ void DestroyStack(SqStackPtr Stack) {assert(Stack != NULL);if (NULL == Stack){printf("%d-->%s error", __LINE__, __FILE__);exit(-1);}free(Stack->base);Stack->base = Stack->top = NULL; }/* ------------------------------------------------------------ 操作目的: 清空棧 初始條件: 棧Stack已經存在 操作結果: 清空棧Stack 函數參數: SqStackPtr Stack 待清空的棧 返回值:無 ------------------------------------------------------------*/ void ClearDtack(SqStackPtr Stack) {assert(Stack != NULL);if (NULL == Stack){printf("%d-->%s error", __LINE__, __FILE__);exit(-1);}Stack->top = Stack->base; }/* ------------------------------------------------------------ 操作目的: 判斷棧是否為空 初始條件: 棧Stack已經存在 操作結果: 若棧Stack為空,則返回true,否則返回false 函數參數:SqStackPtr Stack 待判斷的棧 返回值:bool 是否為空 ------------------------------------------------------------*/bool IsStackEmpty(SqStack Stack) {return Stack.top == Stack.base ? true : false; }/* ------------------------------------------------------------ 操作目的: 得到棧長度 初始條件: 棧Stack已經存在 操作結果: 返回棧Stack中數據元素的個數 函數參數:SqStackPtr Stack 需要求長度的棧 返回值:int 棧中數據元素的個數 ------------------------------------------------------------*/int StackLength(SqStack Stack) {return Stack.top - Stack.base; }/* ------------------------------------------------------------ 操作目的: 得到棧頂元素 初始條件: 棧Stack已經存在 操作結果: 用 e 返回棧頂元素 函數參數:SqStackPtr Stack 棧StackElemType* e 棧頂元素 返回值:bool 操作是否成功 ------------------------------------------------------------*/ bool GetTop(SqStack Stack, ElemType* e) {if (Stack.base == Stack.top)return false;else{*e = *(Stack.top - 1);}return true; }/* ------------------------------------------------------------ 操作目的: 遍歷棧 初始條件: 棧Stack已經存在 操作結果: 以此對于棧Stack的每一個元素調用函數fp 函數參數:SqStackPtr Stack 棧Stackvoid(*fp)(ElemType) 訪問每一個數據元素的函數指針 返回值:bool 操作是否成功 ------------------------------------------------------------*/void StackTraverse(SqStack Stack, void(*fp)(ElemType)) {while (Stack.base < Stack.top){(*fp)(*Stack.base);Stack.base++;}printf("\n"); }/* ------------------------------------------------------------ 操作目的: 壓棧 初始條件: 棧Stack已經存在 操作結果: 以此對于棧Stack的每一個元素調用函數fp 函數參數:SqStackPtr Stack 棧StackElemType e 待插入的數據元素 返回值:bool 操作是否成功 ------------------------------------------------------------*/bool Push(SqStackPtr Stack, ElemType e) {assert(Stack != NULL);if (NULL == Stack){printf("%d-->%s error", __LINE__, __FILE__);exit(-1);}if ((Stack->top - Stack->base) == Stack->stacksize){Stack->base = (ElemType*)realloc(Stack->base, (Stack->stacksize + STACK_ADD_SIZE) * sizeof(ElemType));if (!Stack->base){return false;}Stack->top = Stack->base + Stack->stacksize;Stack->stacksize += STACK_ADD_SIZE;}*(Stack->top++) = e;return true; }/* ------------------------------------------------------------ 操作目的: 出棧 初始條件: 棧Stack已經且為非空 操作結果: 刪除棧頂元素,并用e返回元素值 函數參數:SqStackPtr Stack 棧StackElemType e 被刪除的數據元素 返回值:bool 操作是否成功 ------------------------------------------------------------*/bool Pop(SqStackPtr Stack, ElemType* e) {assert(Stack != NULL);if (NULL == Stack){printf("%d-->%s error", __LINE__, __FILE__);exit(-1);}if (Stack->top == Stack->base)return false;*e = *(--Stack->top);return true; }main.cpp
#include<stdio.h> #include "SqStack.h" int main() {SqStack s;InitStack(&s);if (IsStackEmpty(s))printf("棧為空\n");elseprintf("棧不為空\n");printf("壓棧:\n");for (int i = 0; i < 10; i++){Push(&s, i * 11);}printf("棧中所有數據元素為:\n");StackTraverse(s, visit);ElemType tmp = 0;GetTop(s, &tmp);printf("棧頂元素為%d\n", tmp);Pop(&s, &tmp);printf("出棧元素為%d\n", tmp);printf("棧長度為%d\n", StackLength(s));Pop(&s, &tmp);printf("出棧元素為%d\n", tmp);printf("棧長度為%d\n", StackLength(s));Pop(&s, &tmp);printf("出棧元素為%d\n", tmp);printf("棧長度為%d\n", StackLength(s));printf("棧中所有數據元素為:\n");StackTraverse(s, visit);if (IsStackEmpty(s))printf("棧為空\n");elseprintf("棧不為空\n");printf("清空棧\n");ClearDtack(&s);if (IsStackEmpty(s))printf("棧為空\n");elseprintf("棧不為空\n");DestroyStack(&s);return 0; }測試結果
總結
以上是生活随笔為你收集整理的栈的动态顺序存储和实现(C语言)【栈】(7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 顺序栈实现括号匹配的检验(C语言实现)【
- 下一篇: 头文件包含【预处理】(58)