用棧實現隊列(C語言)

目錄

  • 題目
    • 題目分析
  • 代碼
    • 棧的實現
      • 結構體。
      • 棧的初始化
      • 棧的銷毀
    • 入棧
      • 刪除
      • 查找頂部數據
      • 判空
    • 答案
      • 結構體
      • 初始化
      • 插入數據
      • 刪除數據
      • 獲取隊列開頭元素
      • 判空
      • 銷毀棧

題目

題目分析

鏈接: 題目

請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(push、pop、peek、empty):

實現 MyQueue 類:

void push(int x) 將元素 x 推到隊列的末尾
int pop() 從隊列的開頭移除并返回元素
int peek() 返回隊列開頭的元素
boolean empty() 如果隊列為空,返回 true ;否則,返回 false

根據題目,我們可以知道,我們需要用兩個棧來實現隊列,的出入規則是后進先出,而隊列的出入規則是先進先出
如果我們現在又兩個棧,pushpstpopst,先在pushst中入4個數據(4,3,2,1)。
在這里插入圖片描述
如果我們要出數據的話,我們根據隊列的出入原則,應該出數據1,所以我們可以把pushst里面的數據全部倒入到popst中,那么popst中的數據為(1,2,3,4).
如圖:
在這里插入圖片描述
如果需要出數據的話,直接按照順序出就可以了。
那么,問題來了,我們要入數據,需要在哪個棧里面入?
答案是pushst.如果我們要入數據(5,6).
在這里插入圖片描述
pushst拿來入數據,popst拿來出數據,剛好可以滿足隊列的需求。先出四個數據。
在這里插入圖片描述
想再出數據時,已經沒有數據了,我們需要從pushst里再次倒入數據(5,6),
在這里插入圖片描述
再依此類推…

代碼

棧的實現

我們實現棧使用的是數組。

結構體。

先創建一個結構體

typedef int STDataType;
typedef struct stack
{STDataType* a;int top;//棧當前大小int capacity;//棧的大小
}ST;

棧的初始化

void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;
}

棧的銷毀

void STDestory(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}

入棧

void Push(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity)//如果棧的空間不夠了,我們需要擴容。{int newnode = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newnode);if (tmp == NULL) {perror("realloc:fail");}pst->a = tmp;pst->capacity = newnode;}pst->a[pst->top++] = x;
}

刪除

void Pop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;//只需要頂部刪除即可
}

查找頂部數據

STDataType Top(ST* pst)
{return pst->a[pst->top-1];
}

判空

bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}

答案

我們需要先創建兩個棧的結構體

結構體

typedef struct {ST pushst;ST popst;
} MyQueue;

初始化

MyQueue* myQueueCreate() {MyQueue * obj = (MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->pushst);//對每一個隊列進行初始化STInit(&obj->popst);return obj;
}

插入數據

void myQueuePush(MyQueue* obj, int x) {Push(&obj->pushst,x);//只需要往pushst里面插入就可以了
}

刪除數據

先對popst判空,如果為空,我們需要倒入數據后,再刪除數據。

int myQueuePop(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){Push(&obj->popst,Top(&obj->pushst));Pop(&obj->pushst);//倒入一個,記得刪除一個}}int top = Top(&obj->popst);//獲取頂部蘇數據Pop(&obj->popst);//刪除頂部數據return top;
}

獲取隊列開頭元素

跟myQueuePop(MyQueue* obj)函數類似

int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){Push(&obj->popst,Top(&obj->pushst));Pop(&obj->pushst);}}return Top(&obj->popst);
}

判空

兩個棧為空,隊列才為空。

bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}

銷毀棧

先要對連個隊列進行銷毀,再對兩個棧的結構體銷毀。

void myQueueFree(MyQueue* obj) {STDestory(&obj->popst);STDestory(&obj->pushst);free(obj);
}

在這里插入圖片描述

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

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

相關文章

數據庫查詢中——having與where的用法

數據庫查詢中——having與where的用法 HAVING 子句在 SQL 中主要用于與 GROUP BY 子句一起使用,以過濾聚合函數的結果。當你使用 GROUP BY 對數據進行分組,并希望基于這些分組后的數據進一步過濾時,你會使用 HAVING 子句。 HAVING 子句通常與…

pyside6下沒有designer.exe、pyside6-uic.exe等

使用conda安裝的pyside6(conda install pyside6),發現pyside6目錄下沒有designer.exe、pyside6-uic.exe等;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安裝…

企業內網自建yum源 倉庫 | rsync同步方案

文章目錄 1.背景概述2.獲取軟件文件2.1 準備同步腳本如下 2.2 準備例外文件清單2.3 統計源端大小2.3 運行腳本開始同步文件 3. 創建網頁服務3.1 安裝nginx并啟用3.2 修改ngnix配置文件 4 創建repo索引和客戶文件4.1 創建repo索引4.2 創建客戶端文件4.3 客戶端下載repo文件 1.背…

用 Python 編寫網絡爬蟲:從網頁獲取數據并存儲到 Excel 文件

在本篇博客中,我們將介紹如何使用 Python 編寫一個簡單的網絡爬蟲,用于從網頁中提取數據,并將這些數據存儲到 Excel 文件中。我們將使用 Python 中的一些庫來實現這個功能,包括 urllib.request、BeautifulSoup 和 openpyxl。 1. 網絡爬蟲的基本原理 網絡爬蟲是一種程序,…

【MyBatis】MyBatis解析全局配置文件源碼詳解

目錄 一、前言 思維導圖概括 二、配置文件解析過程分析 2.1 配置文件解析入口 2.2 初始化XMLConfigBuilder 2.3 XMLConfigBuilder#parse()方法:解析全局配置文件 2.3.1 解析properties配置 2.3.2 解析settings配置 2.3.2.1 元信息對象(MetaClas…

解決移植Metasploitable3到VM虛擬機無網絡的問題

第一步 導入后不要開機,先在虛擬機設置里面將原有的兩個網絡適配器移除。 第二步 接著在選項里面,在客戶機操作系統里面,選擇Microsoft Windwos(W), 版本選擇Windows Server 2008 R2 x64 第三步 先打開虛擬機,然后…

Python_文件操作_學習

目錄 一、關于文件的打開和關閉 1. 文件的打開 2.文件的關閉 二、文件的讀取 1. 文件的讀_r 2. 使用readline 3.使用readlines 三、文件的寫入 1. 文本的新建寫入 2.文本的追加寫入 四、文件的刪除和重命名 1.文件的重命名 2.文件的刪除 五、文件的定位讀寫 1.t…

RK 11.0 多屏模式下修改鼠標進入方式

要求:主屏在左,副屏在右。這種排列情況下鼠標僅可通過主屏的最右側移入副屏的最左側,或從副屏的最左側移入主屏最右側。 1.RK默認設計 1.1 RK的代碼設計是當sys.mouse.presentation1時,鼠標在屏幕邊緣的時候就會移入另一個屏幕 …

CISP-PTE筆記整理

目錄 漏洞基礎代碼合集 網安基礎 常見名詞 信息收集 環境和變量的配置 HTTP請求頭基礎 HTTP基礎知識 MySql基礎語法 各系統的敏感目錄路徑 工具使用 Hackbar的tips java下載配置 Xray下載配置&使用 burp爆破賬號密碼和C段&注意事項 SqlMap爆破&創建…

Unity Miscellaneous入門

概述 在Unity中有非常多好用的組件,也是Unity為我們提供的方便的開發工具,它的功能可能不是主流的內容,比如渲染,音樂,視頻等等,所有Unity把這些內容統一歸到了一個雜項文件組中。 Unity組件入門篇總目錄-…

Python線程

Python線程 1. 進程和線程 先來了解下進程和線程。 類比: 一個工廠,至少有一個車間,一個車間中至少有一個工人,最終是工人在工作。 一個程序,至少有一個進程,一個進程中至少有一個線程,最終…

langchain實戰-從0到1搭建ai聊天機器人

介紹 當前,人工智能大模型公司如雨后春筍般迅速涌現,例如 OpenAI、文心一言、通義千問等,它們提供了成熟的 API 調用服務。然而,隨之而來的是不同公司的繁瑣協議接入過程,這讓許多開發者感到頭疼不已。有沒有一種統一…

SpringBoot + Redis實現對接口的限流

目錄 前言 什么是限流? 實現限流 創建一個注解類 接著創建一個切面類 前言 在項目中,對于接口的限流,是任何項目都必不可少的一部分,主要是為了防止用戶頻繁的發送請求,對服務器造成壓力。 另外一點就是防止外來攻…

C++之第八課

課程列表 今天我們來學一學C里的一些實用的東西。 1.域寬 說到域寬setw&#xff0c;就叒要加頭文件了。 #include<iomanip> 使用格式是&#xff1a; cout<<setw(5)<<"123"; setw括號里面可以改數字&#xff0c;后面就是輸出內容了&#xff…

COD論文筆記 Boundary-Guided Camouflaged Object Detection

動機 挑戰性任務&#xff1a;偽裝物體檢測&#xff08;COD&#xff09;是一個重要且具有挑戰性的任務&#xff0c;因為偽裝物體往往與背景高度相似&#xff0c;使得準確識別和分割非常困難。現有方法的不足&#xff1a;現有的深度學習方法難以有效識別偽裝物體的結構和細節&am…

MySQL索引、視圖練習

素材 1.學生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 學號&#xff0c;姓名&#xff0c;性別&#xff0c;年齡&#xff0c;所在系 Sno為主鍵 2.課程表&#xff1a;Course (Cno, Cname,) 課程號&#xff0c;課程名 Cno為主鍵 3.學生選課表&#xff1a;SC (Sno…

Home Credit - Credit Risk Model Stability

本篇是對Kaggle上Home Credit - Credit Risk Model Stability競賽中的開源代碼VotingClassifier Home Credit的解讀。原鏈接在VotingClassifier Home Credit (kaggle.com)。 %%writefile script.py import sys from pathlib import Path import subprocess import os import g…

人工智能的發展現狀,AI將如何改變IT行業,哪些職業將最先失業

文章目錄 一、人工智能的發展現狀1、技術進展與突破2、商業應用與市場3、挑戰與問題4、未來趨勢 二、AI將如何改變IT行業1、工作方式的轉變&#xff1a;2、未來發展的推動&#xff1a;3、用戶服務和體驗的提升&#xff1a;4、創新和轉型的推動&#xff1a;5、融入日常生活和工作…

淺談JMeter運行原理

淺談JMeter運行原理 JMeter架構基礎 JMeter基于Java平臺開發&#xff0c;運行于Java虛擬機&#xff08;JVM&#xff09;之上。這意味著它可以在任何支持JVM的操作系統上運行&#xff0c;包括Windows、Linux、macOS等。其核心架構設計圍繞著多線程執行機制&#xff0c;這使得它…