第7次課 棧A

課堂學習

棧(stack)

是一種遵循先入后出邏輯的線性數據結構。

我們可以將棧類比為桌面上的一摞盤子,如果想取出底部的盤子,則需要先將上面的盤子依次移走。我們將盤子替換為各種類型的元素(如整數、字符、對象等),就得到了棧這種數據結構。

如圖 5-1 所示,我們把堆疊元素的頂部稱為“棧頂”,底部稱為“棧底”。將把元素添加到棧頂的操作叫作“入棧”,刪除棧頂元素的操作叫作“出棧”。

棧是 OI 中常用的一種線性數據結構。請注意,本文主要講的是棧這種數據結構,而非程序運行時的系統棧/棧空間。

棧的修改與訪問是按照后進先出的原則進行的,因此棧通常被稱為是后進先出(last in first out)表,簡稱 LIFO 表。

棧的常用操作

棧的常用操作如下所示,具體的方法名需要根據所使用的編程語言來確定。在此,我們以常見的?push()pop()peek()?命名為例。

通常情況下,我們可以直接使用編程語言內置的棧類。然而,某些語言可能沒有專門提供棧類,這時我們可以將該語言的“數組”或“鏈表”當作棧來使用,并在程序邏輯上忽略與棧無關的操作。

  1. 棧的操作是可以出棧、入棧交替進行的所以出棧序列并不一定是倒序
  2. 注意:已經出棧的數據不要重復入棧
  3. 注意:并不是所有的出棧序列都可以被操作出來
/* 初始化棧 */
stack<int> stack;/* 元素入棧 */
stack.push(1);
stack.push(3);
stack.push(2);
stack.push(5);
stack.push(4);/* 訪問棧頂元素 */
int top = stack.top();/* 元素出棧 */
stack.pop(); // 無返回值/* 獲取棧的長度 */
int size = stack.size();/* 判斷是否為空 */
bool empty = stack.empty();

練一練

總結:

棧的概念
  • 數據的操作只從一端完成,如存、取等;
  • 數據存放遵循,先進后出,后進先出的原則;
棧的操作
  • 入棧、出棧;
  • 棧頂元素、棧底元素、空棧、滿棧:
  • 判斷出棧順序

棧的實現

為了深入了解棧的運行機制,我們來嘗試自己實現一個棧類。

棧遵循先入后出的原則,因此我們只能在棧頂添加或刪除元素。然而,數組和鏈表都可以在任意位置添加和刪除元素,因此棧可以視為一種受限制的數組或鏈表。換句話說,我們可以“屏蔽”數組或鏈表的部分無關操作,使其對外表現的邏輯符合棧的特性。

入棧

?出棧

取棧頂元素

清空棧

#include<bits/stdc++.h>
using namespace std;
int a[6], top = -1;  // 初始化top為 -1,表示棧空void push(int x) {  // 入棧函數if (top < 5) {top++;a[top] = x;}return;
}void pop() {  // 出棧函數if (top > -1) {  // 這里應該是top > -1 ,原代碼top>0邏輯有誤,棧空時top為 -1top--;}return;
}int getTop() {  // 顯示棧頂元素if (top > -1) {return a[top];}return -1;  // 棧空時返回 -1 作為標識
}void clear() {  // 清空棧top = -1;return;
}int main() {push(1);  // 示例入棧操作push(2);cout << getTop() << endl;  // 輸出棧頂元素pop();cout << getTop() << endl;clear();return 0;
}
  1. 頭文件和命名空間#include<bits/stdc++.h>?包含了大量常用的頭文件,using namespace std;?引入標準命名空間,方便使用標準庫函數和類型。
  2. 變量定義:定義了數組?a?用于模擬棧,top?用于表示棧頂元素的下標,初始化為 -1 表示棧為空。
  3. 函數實現
    • push?函數:將元素?x?壓入棧中,前提是棧未滿(top < 5?,因為數組大小為 6 ,下標從 0 到 5 )。
    • pop?函數:彈出棧頂元素,條件是棧非空(top > -1?)。
    • getTop?函數:獲取棧頂元素,棧非空時返回棧頂元素值,棧空返回 -1 。
    • clear?函數:將?top?重置為 -1 ,清空棧。
  4. main?函數:進行了一些棧操作的示例,包括入棧、獲取棧頂元素、出棧、再次獲取棧頂元素和清空棧等操作,并輸出相關結果。

課堂訓練

4145?棧的操作

描述

輸入5個整數,將這5個整數進行入棧,接下來做三次出棧操作,按照出棧順序輸出出棧元素,以上操作完成后輸出此時的棧頂元素。

輸入描述

輸入5個整數,用空格隔開。

輸出描述

輸出2行,第1行輸出出棧元素,按照出棧順序輸出,用空格隔開。第2行輸出完成出棧操作后的棧頂元素。

樣例輸入 1?

4 9 12 6 7

樣例輸出 1?

7 6 12
9

提示

數據范圍與提示

1≤整數≤1000

#include<bits/stdc++.h>
using namespace std;
int a[6], top;
void push(int x) { //入棧函數if (top<5) {top++;a[top]=x;}return;
}
void pop() { //出棧函數if (top>0) {top--;}return;
}
int getTop() { //顯示棧頂元素return a[top];
}
void clear() { //清空棧top=0;return;
}
int main() {int num=0;//入棧for (int i=1;i<=5;i++) {cin>>num;push(num);}//出棧并輸出出棧元素for (int i=1;i<=3;i++) {cout<<getTop()<<" ";pop();}//輸出棧頂元素cout<<endl<<getTop();return 0;
} 

2858?小魚的數字游戲

描述

小魚最近被要求參加一個數字游戲,要求它把看到的一串數字a1、a2、a3…an-1、an?,反著念出來。如:1、2、3,反著念為:3、2、1。這對小魚的那點記憶力來說實在是太難了,所以請你幫小魚編程解決這個問題。

輸入描述

第一行輸入一個整數n(1<n<10)。
第二行輸入n個數字,以空格間隔。

輸出描述

一行內倒序輸出n個數字,以空格間隔。

樣例輸入 1?

7
3 65 23 5 34 1 30

樣例輸出 1?

30 1 34 5 23 65 3
#include<bits/stdc++.h>
using namespace std;
int s[101];
int top=0;
//入棧
void push(int x) {if (top<100) {top++;s[top]=x;}return;
}
//出棧
void pop() {if (top>0) {top--;}return;
}
//顯示棧頂
int getTop() {return s[top];
}int main() {int n = 0, num = 0;cin>>n;//輸入并入棧for (int i = 0; i < n; i++) {cin >> num;push(num); //入棧}//輸出并出棧while (top > 0) { //判斷棧不為空cout << getTop() << " "; //輸出棧頂pop(); //出棧}return 0;
}

2857?小括號問題

描述

假設表達式中只允許包含一種括號:圓括號,需要成對出現。即(( ))或(( )( ))等為正確的格式,(( )或 ( ))或(((均為不正確的格式。
給定一串括號輸入(換行作為結束符),檢測格式是否正確,若正確輸出YES;錯誤輸出NO。
(括號數量≤100)

輸入描述

輸出描述

樣例輸入 1?

(())

樣例輸出 1?

YES
#include<bits/stdc++.h>
using namespace std;
char s[101], a[101];
int top=0;
//入棧
void push(char x) {if (top<200) {top++;s[top]=x;}return;
}
//出棧
void pop() {if (top>0) {top--;}return;
}
//顯示棧頂
char getTop() {return s[top];
}
int main() {cin >> a;//獲取字符串int len=strlen(a);for (int i=0; i<len; i++) {//左括號入棧if (a[i]=='('){push(a[i]);} else if (getTop()=='(') {pop();} else {cout << "NO";return 0;	}}//棧空時if (top==0) {cout << "YES";//棧非空時} else {cout << "NO";}return 0;
}

2859?括號匹配問題

描述

假設表達式中允許包含兩種括號:圓括號和方括號,其嵌套的順序隨意,但需要成對出現。即()或 [([ ][ ])]等為正確的格式,[ ( ] )或 ( [ ( ) )或( ( ) ] )均為不正確的格式。
給定一串括號輸入(換行作為結束符),檢測格式是否正確,若正確輸出YES;錯誤輸出NO。
(括號數量≤100)

輸入描述

輸出描述

樣例輸入 1?

([]())

樣例輸出 1?

YES
#include<bits/stdc++.h>
using namespace std;
char s[101], a[101];
int top=0;
//入棧
void push(char x) {if (top<200) {top++;s[top]=x;}return;
}
//出棧
void pop() {if (top>0) {top--;}return;
} 
//顯示棧頂
char getTop() {return s[top];
} 
int main() {cin >> a;//獲取字符串int len=strlen(a);for (int i=0; i<len; i++) {//左括號入棧if (a[i]=='['||a[i]=='('){push(a[i]);//右括號對比} else if (a[i]==')' && getTop()=='(') {pop();} else if (a[i]==']' && getTop()=='[') {pop();//既匹配不了棧頂也無法入棧} else {cout << "NO";return 0;}}//棧空時if (top==0) {cout << "YES";//棧非空時} else {cout << "NO";}return 0;
}

課后作業

2879? 字母的讀寫
2880 中括號問題
5296 括號成加對數量
1680 調度員的煩惱

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

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

相關文章

ts裝飾器

TypeScript 裝飾器是一種特殊類型的聲明&#xff0c;能夠被附加到類聲明、方法、訪問符、屬性或參數上。它本質上是一個函數&#xff0c;會在運行時被調用&#xff0c;并且被裝飾的聲明信息會作為參數傳遞給裝飾器函數。 裝飾器的分類 類裝飾器 類裝飾器作用于類構造函數&…

【金倉數據庫征文】政府項目數據庫遷移:從MySQL 5.7到KingbaseES的蛻變之路

摘要&#xff1a;本文詳細闡述了政府項目中將 MySQL 5.7 數據庫遷移至 KingbaseES 的全過程&#xff0c;涵蓋遷移前的環境評估、數據梳理和工具準備&#xff0c;遷移實戰中的數據源與目標庫連接配置、遷移任務詳細設定、執行遷移與過程監控&#xff0c;以及遷移后的質量驗證、系…

VB與Excel無縫連接實現指南

一、前期準備 引用Excel對象庫&#xff1a; 在VB開發環境中&#xff0c;點擊"項目"→"引用" 勾選"Microsoft Excel XX.X Object Library"&#xff08;XX.X代表版本號&#xff09; 創建Excel應用程序對象&#xff1a; vb Dim xlApp As Excel.…

【MySQL】數據庫、數據表的基本操作

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;MySQL 文章目錄 1. MySQL基礎命令1.1 連接MySQL1.2 基本命令概覽 2. 數據庫操作2.1 創建數據庫2.2 查看數據庫2.3 選擇數據庫2.4 修改數據庫2.5 刪除數據庫2.6 數據庫備份與恢復 3. 表操作基礎3.1 創建表3.2 查看表信息3.3 創建…

cursor sign in 網頁登錄成功,sursor軟件里一直登陸不成功沒有登陸信息

今天在使用cursor登陸無法登陸&#xff0c;點擊sigin in打開網址登陸成功后&#xff0c;軟件里一直無法顯示登陸信息。 點擊sigin in 在網址登陸成功后 解決辦法&#xff1a; 方法1.設置windows默認應用為chrome. 辦法2: 刪除代理 cursor上ctrl, 打開設置&#xff0c;找到…

深入理解卷積神經網絡的輸入層:數據的起點與預處理核心

內容摘要 本文圍繞卷積神經網絡輸入層展開&#xff0c;詳細介紹其在網絡中的重要作用&#xff0c;包括接收不同領域數據的形式及傳遞數據的過程。深入解讀數據預處理的關鍵操作&#xff0c;如去均值、歸一化和PCA/白化。助力讀者透徹理解輸入層&#xff0c;為構建高效卷積神經…

解決 MySQL 數據庫無法遠程連接的問題

在使用 MySQL 數據庫時&#xff0c;遇到這樣的問題&#xff1a; 本地可以連接 MySQL&#xff0c;但遠程機器連接時&#xff0c;總是報錯 Host ... is not allowed to connect to this MySQL server。 這通常是因為 MySQL 的用戶權限或配置限制了遠程訪問。 1. 登錄 MySQL 數據…

MCP認證全解析:從零到微軟認證專家

MCP認證全解析&#xff1a;從零到微軟認證專家 什么是MCP認證&#xff1f; Microsoft Certified Professional&#xff08;MCP&#xff09;是由微軟官方頒發的技術認證&#xff0c;旨在驗證IT從業者在微軟技術棧&#xff08;如Azure、Windows Server、SQL Server等&#xff0…

驅動開發系列57 - Linux Graphics QXL顯卡驅動代碼分析(四)顯示區域更新

一&#xff1a;概述 前面在介紹了顯示模式設置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文繼續分析下&#xff0c;顯示區域的繪制&#xff0c;詳細看看虛擬機的畫面是如何由QXL顯卡繪制出來的。 二&#xff1a;相關數據結構介紹 struct qxl_moni…

遠程調用負載均衡LoadBalancer

1. 什么是負載均衡 負載均衡就是將負載&#xff08;工作任務&#xff0c;訪問請求&#xff09;進行分攤到多個操作單元&#xff08;服務器,組件&#xff09;上進行執行。 根據負載均衡發生位置的不同,一般分為服務端負載均衡和客戶端負載均衡。 服務端負載均衡&#xff1a;指的…

【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀

【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀 文章目錄 【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀前言if name ‘main’parse_opt函數main函數run函數不同命令參數的推理結果常規推理命令推理命令(新增…

NextPolish1.4.1 安裝與使用-bioinformatics tools54

01 簡介 NextPolish 是一個用于修正由低準確度長讀段&#xff08;如 ONT 或 CLR&#xff09;組裝出來的基因組序列中堿基錯誤&#xff08;SNV/Indel&#xff09;的工具。它支持&#xff1a; 僅使用短讀段 僅使用長讀段 同時使用短讀段與長讀段 NextPolish 包含兩個核心模塊…

Vue3 el-tree:全選時只返回父節點,半選只返回勾選中的節點(省-市區-縣-鎮-鄉-村-街道)

需求原因&#xff1a;全選時&#xff0c;傳給接口的code數據太多了&#xff1b; 如果加上 check-strictly 父節點與子節點無關聯&#xff0c;可以初步滿足需求 效果如下使用了check-strictly的話&#xff0c;tree就沒有了半選效果 不好的地方&#xff1a;用戶體驗感不好&#x…

使用 docker 安裝 nacos3.x

一、安裝 nacos 1.拉取鏡像 使用如下指令拉取鏡像 docker pull nacos/nacos-server 拉取完成后&#xff0c;可以使用以下命令查看是否拉取到對應的鏡像&#xff0c;默認拉取最新鏡像 docker images 2.新建掛載文件目錄 mkdir -p /home/ubuntu/nacos/conf/mkdir -p /home/…

高性能Python Web 框架--FastAPI 學習「基礎 → 進階 → 生產級」

以下是針對 FastAPI 的保姆級教程&#xff0c;包含核心概念、完整案例和關鍵注意事項&#xff0c;采用「基礎 → 進階 → 生產級」的三階段教學法&#xff1a; 一、FastAPI介紹 FastAPI 是一個現代化的、高性能的 Python Web 框架&#xff0c;專門用于構建 APIs&#xff08;應…

H2 Database Select 語句執行流程

H2 Database Select 語句執行流程 使用 // CREATE TABLE IF NOT EXISTS test(id INT primary key, name VARCHAR(255)) // insert into test(id, name) values(1, name1), (2, name2), (3, name3), (4, name4); String sql "SELECT * FROM test where id > 1 and na…

理解 Envoy 的架構

理解 Envoy 的架構對于深入理解 Istio 至關重要&#xff0c;因為 Envoy 是 Istio 數據平面的核心。Envoy 是一個高性能的 C 分布式代理&#xff0c;設計為云原生應用和大規模微服務架構的網絡基礎。 以下是 Envoy 架構的關鍵組成部分和核心理念&#xff1a; 核心設計理念&…

Android開發-常用布局

在Android應用開發中&#xff0c;布局決定了用戶界面的結構和元素之間的相對位置。選擇合適的布局不僅能夠提升用戶體驗&#xff0c;還能提高代碼的可維護性和靈活性。本文將介紹幾種最常用的Android布局方式&#xff0c;包括LinearLayout、RelativeLayout、ConstraintLayout以…

如何在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態?

要在MySQL中實現類似Redis的PING命令的功能來檢測連接狀態&#xff0c;可以采用以下方法&#xff1a; 方法一&#xff1a;使用簡單的SQL查詢 最直接的方法是通過執行一個簡單的查詢來檢測連接狀態&#xff0c;例如&#xff1a; SELECT 1;如果查詢成功并返回結果&#xff08;…

Vue 系列之:defineProps、defineEmits、...

defineProps 用于接收父組件傳遞的屬性值。 父組件&#xff1a; <!-- 父組件 --> <template><Child1 str"字符串" :num"num" />-----------------<Child2 str"字符串" :num"num" /> </template><…