Day04_數據結構(棧鏈棧循環隊列)

01.棧

main.c

#include "stack.h"                               
int main()                                       
{                                                stack_p S=(stack_p)create_stack();           //1.入棧                                     printf("入棧數據1:\n");                      push_stack(S,1);                             show_stack(S);                               printf("入棧數據2:\n");                      push_stack(S,2);                             show_stack(S);                               printf("入棧數據3:\n");                      push_stack(S,3);                             show_stack(S);                               printf("入棧數據4:\n");                      push_stack(S,4);                             show_stack(S);                               printf("入棧數據5:\n");                      push_stack(S,5);                             show_stack(S);                               //2.出棧                                     printf("出棧數據1:%d\n",pop_stack(S));       show_stack(S);                               printf("出棧數據2:%d\n",pop_stack(S));       show_stack(S);                               //3.銷毀棧                                   printf("銷毀后數據:\n");                     destory(&S);                                 printf("%p\n",S);                            return 0;                                    
}                                                

stack.c

#include "stack.h"
//1、創建順序棧
stack_p create_stack()
{stack_p S = (stack_p)malloc(sizeof(stack));if(S==NULL){return NULL;}bzero(S,sizeof(stack));  //把申請的所有空間都初始為0S->top = -1;  //-1是棧頂位置top的初始值return S;
}
//2、判空
int empty_stack(stack_p S)
{if(S==NULL){return -1;}return S->top==-1;
}
//3、判滿
int full_stack(stack_p S)
{if(S==NULL){return -1;}return S->top==MAX-1;
}
//4、入棧
void push_stack(stack_p S,int value)
{if(S==NULL){return;}if(full_stack(S)){return;}//先加棧頂位置,再將元素壓入棧//先加再壓//S->data[++(S->top)] = value;S->top++;S->data[S->top] = value;
}
//5、出棧
int pop_stack(stack_p S)
{if(S==NULL){return -1;}if(empty_stack(S)){return -2;}return S->data[S->top--];
}
//6、輸出棧中元素
void show_stack(stack_p S)
{if(S==NULL){return;}if(empty_stack(S)){return;}int i;for(i=S->top;i>=0;i--){printf("%d\n",S->data[i]);}
}
//7、銷毀棧
/*void destory(stack_p S)
{if(S==NULL){return;}free(S); 
}*/
void destory(stack_p *S)
{if(S==NULL||*S==NULL){return;}free(*S);*S = NULL;
}
//7、銷毀棧                          
void destory(stack_p *S)             
{                                    if(S==NULL||*S==NULL)            {                                printf("空棧無需銷毀.\n");   return;                      }                                while(empty_stack(*S)==0){       pop_stack(*S);               }                                free(*S);                        *S=NULL;                         
}                                    

stack.h

#ifndef __STACK_H__
#define __STACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 7
typedef struct 
{int data[MAX];int top;  //記錄棧頂元素的下標
}stack,*stack_p;
//1、創建順序棧
stack_p create_stack();
//2、判空
int empty_stack(stack_p S);
//3、判滿
int full_stack(stack_p S);
//4、入棧
void push_stack(stack_p S,int value);
//5、出棧
int pop_stack(stack_p S);
//6、輸出棧中元素
void show_stack(stack_p S);
//7、銷毀棧
void destory(stack_p *S);#endif

02.鏈棧

main.c

#include "link.h"
int main()
{node_p S=NULL;printf("入棧第一數:\n");push_stack(&S,1);show_stack(&S);printf("入棧第二數:\n");push_stack(&S,2);show_stack(&S);printf("入棧第三數:\n");push_stack(&S,3);show_stack(&S);printf("入棧第四數:\n");push_stack(&S,4);show_stack(&S);printf("出棧第一數:\n");printf("%d\n",pop_stack(&S));printf("出棧第一數:\n");printf("%d\n",pop_stack(&S));printf("入棧第五數:\n");push_stack(&S,100);show_stack(&S);return 0;
}

links.c

#include "link.h"
node_p create_node(int value)
{node_p new=(node_p)malloc(sizeof(node));if(new==NULL){printf("創建結點失敗.\n");return NULL;}new->next=NULL;new->data=value;return new;
}
int empty_stack(node_p S)
{return S==NULL;
}//入棧操作需要修改主函數中棧頂指針的指向
void push_stack(node_p *S,int value)
{//S是一個二級指針,保存主函數內棧頂指針的地址if(S==NULL){return;}//不用判斷*S,因為如果*S==NULL說明棧中沒有元素node_p new = create_node(value);new->next = *S;  //新結點指向原來的棧頂元素*S = new;   //讓主函數中的棧頂指針S指向新的棧頂結點
}
//出棧
int pop_stack(node_p *S)
{if(*S==NULL){return -1;}if(empty_stack(*S)){return -2;}int ret=(*S)->data;node_p del = *S;   //先保存棧頂結點*S = (*S)->next;   //讓棧頂指針向后指一個結點free(del);   //釋放棧頂元素return ret;}
//輸出
void show_stack(node_p *S)
{if(S==NULL){printf("入參指針為空,無法操作.\n");return;}node_p p=*S;if(empty_stack(p)){printf("棧為空,沒有值可以輸出.\n");return;}printf("棧元素(從棧頂到棧底):\n");while(p!=NULL){printf("%d->",p->data);p=p->next;}printf("bottom\n");
}

links.h

#ifndef __LINK_H__
#define __LINK_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{int data;struct node *next;
}node,*node_p;node_p create_node(int value);
int empty_stack(node_p S);
void push_stack(node_p *S,int value);
int  pop_stack(node_p *S);
void show_stack(node_p *S);
#endif

03.循環隊列

main.c

#include "queue.h"
int main()
{queue_p Q=(queue_p)create_que();printf("入隊第一個數字:\n");push_que(Q,1);show(Q);printf("入隊第二個數字:\n");push_que(Q,2);show(Q);printf("入隊第三個數字:\n");push_que(Q,3);show(Q);printf("入隊第四個數字:\n");push_que(Q,4);show(Q);printf("入隊第五個數字:\n");push_que(Q,5);show(Q);printf("出隊第1個數字:\n");pop_que(Q);show(Q);printf("出隊第2個數字:\n");pop_que(Q);show(Q);printf("隊列中元素個數:%d\n",cont_que(Q));printf("銷毀前:");printf("%p\n",Q);destory(&Q);printf("銷毀后:");printf("%p\n",Q);}

queue.c

#include "queue.h"//1.創建循環隊列
queue_p create_que()
{queue_p Q=(queue_p)malloc(sizeof(queue));if(Q==NULL){printf("申請節點失敗.\n");return NULL;}bzero(Q,sizeof(queue));Q->front=4;Q->front=Q->rear;return Q;
}
//2.判空
int empty_queue(queue_p Q)
{if(Q==NULL){printf("入參為空.\n");return -1;}return Q->front==Q->rear?1:0;
}
//3.判滿
int full_queue(queue_p Q)
{if(Q==NULL){printf("入參為空.\n");return -1;}return (Q->rear+1)%MAX==Q->front?1:0;
}
//4.入隊
void push_que(queue_p Q,int value)
{if(Q==NULL){printf("入參為空.\n");return;}if(full_queue(Q)){printf("隊列已滿,無法入隊.\n");return;}Q->data[Q->rear]=value;Q->rear=(Q->rear+1)%MAX;
}
//5.出隊
int pop_que(queue_p Q)
{if(Q==NULL){printf("入參為空.\n");return -1;}if(empty_queue(Q)){printf("隊列為空,無法入隊.\n");return -2;}int ret=Q->data[Q->front];Q->front=(Q->front+1)%MAX;return ret;
}
//6.從對頭開始輸出
void show(queue_p Q)
{if(Q==NULL){printf("入參為空.\n");return;}if(empty_queue(Q)){printf("隊列為空,無法輸出.\n");return;}int i=Q->front;while(i!=Q->rear){printf("%-3d",Q->data[i]);i=(i+1)%MAX;}putchar(10);
}
//7.返回隊列中元素的個數
int cont_que(queue_p Q)
{if(Q==NULL){printf("入參為空.\n");return -1;}return (Q->rear-Q->front+MAX)%MAX;}//8.銷毀隊列
void destory(queue_p *Q)
{if(Q==NULL||*Q==NULL){printf("隊列為空.\n");return;}free(*Q);*Q=NULL;}

queue.h

#ifndef __QUEUE_H__
#define __QUEUE_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 8
typedef struct {int data[MAX];int front;int rear;
}queue,*queue_p;queue_p create_que();
int empty_queue(queue_p Q);
int full_queue(queue_p Q);
void push_que(queue_p Q,int value);
int pop_que(queue_p Q);
void destory(queue_p *Q);
void show(queue_p Q);
int cont_que(queue_p Q);#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84299.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch 的 CUDA GPU 支持 · 安裝五條鐵律(最新版 2025 修訂)(適用于所有用戶)

相關參考資料&#xff08;往期博客&#xff09;&#xff1a; 是否需要預先安裝 CUDA Toolkit&#xff1f;——按使用場景分級推薦及進階說明-CSDN博客 太方便&#xff0c;WIN系統CUDA12.4下使用conda便捷管理虛擬環境中的不同版本的CUDA、cuDNN、PyTorch-CSDN博客 好消息&#…

Django構建簡易視頻編輯管理系統

Django構建簡易視頻編輯管理系統 以下是基于Django構建簡易視頻編輯管理系統的可運行代碼框架&#xff0c;包含核心功能模塊和實現邏輯。該系統支持視頻上傳、基本剪輯操作和管理功能。 環境準備 安裝必要依賴包&#xff1a; pip install django pillow moviepy django-cri…

Java求職者面試題詳解:計算機網絡、操作系統、設計模式與數據結構

Java求職者面試題詳解&#xff1a;計算機網絡、操作系統、設計模式與數據結構 第一輪&#xff1a;基礎概念問題 1. 請解釋TCP和UDP的區別。 2. 什么是操作系統&#xff1f;它的主要功能是什么&#xff1f; 3. 請解釋設計模式中的單例模式&#xff0c;并給出一個實際應用的例…

【mysql】docker運行mysql8.0

背景 mariadb10.5.8報錯&#xff1a;Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘LIMIT ?’ at line 1 所以更換為mysql8.0.39試試 docker run啟動…

C#實現語音預處理:降噪/靜音檢測/自動增益

無論是在音視頻錄制系統&#xff0c;還是音視頻通話系統、或視頻會議系統中&#xff0c;對從麥克風采集到的說話的聲音數據進行預處理&#xff0c;都是是非常必要的。 語音數據預處理主要包括&#xff1a;??降噪&#xff08;Noise Reduction&#xff09;、靜音檢測&#xff0…

組合模式Composite Pattern

模式定義 又稱整體-部分模式 組合多個對象形成 樹形結構 以表示“整體-部分”的結構層次 組合模式對單個對象&#xff08;即葉子對象&#xff09;和組合對象&#xff08;即容器對象&#xff09;的使用具有一致性對象結構型模式 模式結構 Component&#xff1a;抽象構件Leaf&a…

商代大模型:智能重構下的文明曙光與青銅密碼

引言&#xff1a;技術奇點的歷史想象 在人類文明的長河中&#xff0c;技術的進步始終是推動社會變革的核心動力。從青銅冶煉到文字發明&#xff0c;從農業革命到工業革命&#xff0c;每一次技術飛躍都重塑了人類對世界的認知與生存方式。而如今&#xff0c;人工智能的崛起正以…

【Python】python系列之函數作用域

Python 系列文章學習記錄&#xff1a; Python系列之Windows環境安裝配置_開著拖拉機回家的博客-CSDN博客 Python系列之變量和運算符_開著拖拉機回家的博客-CSDN博客 Python系列之判斷和循環_開著拖拉機回家的博客-CSDN博客 Python系列之字符串和列表_開著拖拉機回家的博客…

Unity UI 核心類解析之Graphic

&#x1f9f1; Unity UI 核心類解析&#xff1a;Graphic 類詳解 一、什么是 Graphic&#xff1f; 在 Unity 的 UI 系統中&#xff0c;Graphic 是一個抽象基類&#xff0c;繼承自 UIBehaviour 并實現了 ICanvasElement 接口。它是所有可以被繪制到屏幕上的 UI 元素的基礎類。 …

【Elasticsearch】文檔遷移(Reindex)

文檔遷移 1.為什么要進行 reindex 操作2.Reindex 操作的本質3.實際案例3.1 同集群索引之間的全量數據遷移3.2 同集群索引之間基于特定條件的數據遷移3.2.1 源索引設置檢索條件3.2.2 基于 script 腳本的索引遷移3.2.3 基于預處理管道的數據遷移 3.3 不同集群之間的索引遷移3.4 查…

WordPress 區塊版面配置指南

WordPress 的區塊編輯器(Gutenberg)提供了靈活的版面配置選項&#xff0c;以下是主要配置方法&#xff1a; 基本區塊布局 添加區塊&#xff1a;點擊””按鈕或按”/”鍵快速插入區塊 常用內容區塊&#xff1a; 段落(Paragraph) 標題(Heading) 圖像(Image) 畫廊(Gallery)…

TensorFlow基礎之理解張量

2.理解張量 張量&#xff08;Tensors&#xff09;介紹 張量是物理和工程領域的基礎數學結構。但是過去張量很少在計算機科學里使用。它與離散數學和邏輯學有更多的聯系。隨著機器學習的出現&#xff0c;這種狀態開始顯著的改變&#xff0c;成為連續向量的計算基礎。現代機器學…

Flume 安裝與配置步驟

1.解壓 tar -zxvf apache-flume-1.9.0-bin.tar.gz 2.配置環境變量 vim /etc/profile export FLUME_HOME/home/wang/soft/flume/apache-flume-1.9.0-bin export PATH$PATH:$FLUME_HOME/bin source /etc/profile 3.創建必要的目錄 mkdir -p $FLUME_HOME/conf 4.創建 Flume 配置文…

還原線上 WebView 異常:手機端APP遠程調試

前端調試總被理解為開發階段的事&#xff0c;但在實際項目中&#xff0c;真正困難的調試往往發生在產品上線之后。用戶反饋“看不到內容”、“一直轉圈”、“點了沒反應”&#xff0c;而開發環境無法復現&#xff0c;測試機也正常運行&#xff0c;這時怎么定位、驗證和解決問題…

102頁滿分PPT | 汽車設備制造業企業信息化業務解決方案智能制造汽車黑燈工廠解決方案

這份文檔是一份汽車設備制造業企業信息化業務解決方案&#xff0c;詳細闡述了企業從生產到銷售的全流程信息化建設。針對企業目前手工管理為主、信息化程度低、數據追溯困難等問題&#xff0c;提出了建立統一信息化平臺的目標&#xff0c;涵蓋財務、業務、流程和數據的整合。方…

SQLite 表達式詳解

SQLite 表達式詳解 引言 SQLite 是一個輕量級的數據庫,廣泛用于移動設備和桌面應用程序。SQLite 的表達式是 SQL 語句的核心,它們用于查詢、更新和刪除數據庫中的數據。本文將詳細解釋 SQLite 的各種表達式,并探討它們在數據庫操作中的重要性。 表達式概述 在 SQLite 中…

沉浸式AI交互數字人技術解析

360智匯云沉浸式AI交互數字人支持開發者靈活接入和私有化部署大模型服務&#xff0c;構建面向業務場景的實時音視頻交互能力。系統集成了360智匯云自研的沉浸式AI交互數字人引擎與高性能 RTC 模塊&#xff0c;保障音視頻傳輸過程中的低延遲、高穩定性和高并發承載能力&#xff…

HarmonyOS 評論回復彈窗最佳實踐

HarmonyOS 評論回復彈窗最佳實踐 前言 在移動應用開發中&#xff0c;評論回復功能是一個常見且重要的交互場景。本文將詳細介紹如何在 HarmonyOS 中實現一個功能完善的評論回復彈窗&#xff0c;包括彈窗選型、富文本編輯、軟鍵盤適配等關鍵技術點。 功能概述 我們要實現的評…

Git 回退操作詳解:帶示例的“小白”指南

前言 在日常開發中&#xff0c;我們難免會遇到&#xff1a; 改錯代碼&#xff1a;推送之前才發現某些行根本就不該動提交錯誤&#xff1a;commit 信息打錯、提交到錯誤分支想回到之前版本&#xff1a;測試時發現之前版本是好的&#xff0c;需要回去查看 這就需要用到 Git 的…

redux以及react-redux

1.redux案例完整版 上一篇文章我們是沒有action文件&#xff0c;直接在countre組件與store以及reducer直接進行狀態的改變以及展示。 下面我們加上action文件&#xff0c;我們就不能直接通過dispatch傳&#xff0c;而是通過調用action里面的函數講我們傳入的參數變成action這種…