當前位置:
首頁 >
数据结构读书笔记(三)(C语言)
發布時間:2025/3/20
28
豆豆
生活随笔
收集整理的這篇文章主要介紹了
数据结构读书笔记(三)(C语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?棧
順序實現:
存儲結構:
?
#define STACK_INIT_SIZE 10 // 存儲空間初始分配量#define STACK_INCREMENT 2 // 存儲空間分配增量struct SqStack{SElemType *base; // 在棧構造之前和銷毀之后,base的值為NULLSElemType *top; // 棧頂指針int stacksize; // 當前已分配的存儲空間,以元素為單位}; // 順序棧
基本操作:
?
void InitStack(SqStack &S){ // 構造一個空棧Sif(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))exit(OVERFLOW); // 存儲分配失敗S.top=S.base;S.stacksize=STACK_INIT_SIZE;}void DestroyStack(SqStack &S){ // 銷毀棧S,S不再存在free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;}void ClearStack(SqStack &S){ // 把S置為空棧S.top=S.base;}Status StackEmpty(SqStack S){ // 若棧S為空棧,則返回TRUE,否則返回FALSEif(S.top==S.base)return TRUE;elsereturn FALSE;}int StackLength(SqStack S){ // 返回S的元素個數,即棧的長度return S.top-S.base;}Status GetTop(SqStack S,SElemType &e){ // 若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERRORif(S.top>S.base){e=*(S.top-1);return OK;}elsereturn ERROR;}void Push(SqStack &S,SElemType e){ // 插入元素e為新的棧頂元素if(S.top-S.base>=S.stacksize) // 棧滿,追加存儲空間{S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW); // 存儲分配失敗S.top=S.base+S.stacksize;S.stacksize+=STACK_INCREMENT;}*(S.top)++=e;}Status Pop(SqStack &S,SElemType &e){ // 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERRORif(S.top==S.base)return ERROR;e=*--S.top;return OK;}void StackTraverse(SqStack S,void(*visit)(SElemType)){ // 從棧底到棧頂依次對棧中每個元素調用函數visit()while(S.top>S.base)visit(*S.base++);printf("\n");}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?循環隊列
?
存儲結構
?
#define MAX_QSIZE 5 // 最大隊列長度+1struct SqQueue{QElemType *base; // 初始化的動態分配存儲空間int front; // 頭指針,若隊列不空,指向隊列頭元素int rear; // 尾指針,若隊列不空,指向隊列尾元素的下一個位置};?
基本操作:
??
?
void InitQueue(SqQueue &Q){ // 構造一個空隊列QQ.base=(QElemType *)malloc(MAX_QSIZE*sizeof(QElemType));if(!Q.base) // 存儲分配失敗exit(OVERFLOW);Q.front=Q.rear=0;}void DestroyQueue(SqQueue &Q){ // 銷毀隊列Q,Q不再存在if(Q.base)free(Q.base);Q.base=NULL;Q.front=Q.rear=0;}void ClearQueue(SqQueue &Q){ // 將Q清為空隊列Q.front=Q.rear=0;}Status QueueEmpty(SqQueue Q){ // 若隊列Q為空隊列,則返回TRUE;否則返回FALSEif(Q.front==Q.rear) // 隊列空的標志return TRUE;elsereturn FALSE;}int QueueLength(SqQueue Q){ // 返回Q的元素個數,即隊列的長度return(Q.rear-Q.front+MAX_QSIZE)%MAX_QSIZE;}Status GetHead(SqQueue Q,QElemType &e){ // 若隊列不空,則用e返回Q的隊頭元素,并返回OK;否則返回ERRORif(Q.front==Q.rear) // 隊列空return ERROR;e=Q.base[Q.front];return OK;}Status EnQueue(SqQueue &Q,QElemType e){ // 插入元素e為Q的新的隊尾元素if((Q.rear+1)%MAX_QSIZE==Q.front) // 隊列滿return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAX_QSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){ // 若隊列不空,則刪除Q的隊頭元素,用e返回其值,并返回OK;否則返回ERRORif(Q.front==Q.rear) // 隊列空return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAX_QSIZE;return OK;}void QueueTraverse(SqQueue Q,void(*vi)(QElemType)){ // 從隊頭到隊尾依次對隊列Q中每個元素調用函數vi()int i;i=Q.front;while(i!=Q.rear){vi(Q.base[i]);i=(i+1)%MAX_QSIZE;}printf("\n");}?
?? ?
?
總結
以上是生活随笔為你收集整理的数据结构读书笔记(三)(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阶乘与斐波那契数的理解
- 下一篇: CentOS内核编译