c++詳解棧

一.什么是棧

堆棧又名棧(stack),它是一種運算受限的數據結構(線性表),只不過他和數組不同,數組我們可以想象成一個裝巧克力的盒子,你想拿一塊巧克力,不需要改變其他巧克力的位置,而棧就相當于是一個只有上方有一個口且寬度只能容納一塊巧克力的盒子,如圖:

那如果我們想拿最下面的巧克力該怎么辦呢?就需要把這顆巧克力上面的所有巧克力都取出,這樣才能取出最下面的巧克力。我們可以把棧想象成是一個封了底的數組,要想拿走一個值就需要把它上面的所有值都取出,同理,如果我們想加入一個數據,也只能加到棧的最頂端。這就是棧。

二.棧的具體實現?

1.手寫棧

如果要手寫一個棧,我們優先選擇用和棧差別最小的數組模擬棧,我們要想模擬一個棧,需要擁有幾個操作函數,如下。

①我們要編寫push函數,作用是往棧里輸入數據

? ? ?要想編寫這樣一個函數,我們首先需要確定數組(棧)的頂端,再把數放進去。我們可以定義一個棧的長度變量,初始值為0,你每輸入一個數據就++。這樣就可以很好的解決棧的輸入了,我們看代碼:

void push(char x) {  //top是棧的長度,M是所模擬的數組的長度,s是棧的名字,x是要往棧頂放的數if(top<M) {    //判斷棧的長度不超過模擬它的數組的長度,則可以輸入。top++;     //將棧頂++s[top]=x;  //把棧頂值設為x}
}

②我們要編寫GetTop 函數,作用是獲取棧頂的值

? ? ? 這個很簡單,我們直接獲取數組的第top項就可以了。我們看代碼:

char getTop() {return s[top];  //返回棧頂元素
}

③我們要編寫彈棧函數,目的是刪除棧頂元素,以取出下一個元素。

? ? ?我們可以直接讓top--,這樣原來的棧頂元素就不在這個棧中了,也就刪除了棧頂元素。我們看代碼:

void pop() {if(top>0) {  //如果棧不空top--;   //刪除棧頂元素}
}

④我們要編寫Getlen函數,目的是獲取棧的長度。

? ? ? ?由于top就是代表著棧頂元素的位置,所以我們只要返回top的值就可以了。我們看代碼:

int getlen() {return top;
}

接下來把所有函數都放在一起發個程序:

#include<iostream>
using namespace std;
const int M=10;   //M大小可動態調整
int s[M+1];
int top=0;
void push(int x) {if(top<M) {top++;s[top]=x;}
}
void pop() {if(top>0) {top--;} 
}
int getTop() {return s[top]; 
}
int getlen() {return top;
}int main() {return 0;
}

二.STL模板

有的人可能會說,手寫棧實在太麻煩了,有沒有簡單的方法呢?當然有!接下來我就給大家講。

STL模板不需要你手動定義棧中的函數,他已經給你定義好了函數和對應的棧,也不用你再用數組模擬了。但想用這個定義好了的棧,我們要導入一個頭文件,如下

#include<stack>

一切準備就緒,我們要想定義一個STL棧,需要用如下代碼:

stack<int>s; 

就是stack后面尖括號里寫數據類型,然后再寫一個棧名就可以了。

STL棧里面有一些常用的函數。

1.push,作用是往棧里輸入一個數據,只不過是用棧名.push(輸入的數據)的方式輸入。如下:

s.push(x)

?2.top,和上面的Gettop函數的作用相同。也需要用棧名.top()的方式來調用。如下:

s.top();

3.pop,和上面的pop作用相同。如下:

s.pop();

4.size,和上面的Getlen函數作用相同。如下:

s.size();

三.例題

題目描述

假設一個表達式有英文字母(小寫)、運算符(+-*/)和左右小(圓)括號構成,以?@?作為表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則輸出?YES;否則輸出?NO。表達式長度小于?255,左圓括號少于?20?個。

輸入格式

一行:表達式。

輸出格式

一行:YES?或?NO

輸入輸出樣例

輸入 #1復制

2*(x+y)/(1-x)@

輸出 #1復制

YES

輸入 #2復制

(25+x)*(a*(a+b+b)@

輸出 #2復制

NO

說明/提示

表達式長度小于?255,左圓括號少于?20?個。

?程序?(裝逼代碼)

#include<bits/stdc++.h>
using namespace std;
stack<char> a;
int main() {string s;cin>>s;for(int i=0; i<s.length(); i++) {if(s[i]=='(') {a.push(s[i]);}if(s[i]==')') {if(a.size()>=1&&a.top()=='(') {a.pop();} else {cout<<"NO";return 0;}}}if(a.size==0)cout<<"YES";else cout<<"NO";return 0;
}

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

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

相關文章

基于AWS Serverless的Glue服務進行ETL(提取、轉換和加載)數據分析(二)——數據清洗、轉換

2 數據清洗、轉換 此實驗使用S3作為數據源 ETL: E extract 輸入 T transform 轉換 L load 輸出 大綱 2 數據清洗、轉換2.1 架構圖2.2 數據清洗2.3 編輯腳本2.3.1 連接數據源&#xff08;s3&#xff09;2.3.2. 數據結構轉換2.3.2 數據結構拆分…

FFmpeg開發筆記(六)如何訪問Github下載FFmpeg源碼

學習FFmpeg的時候&#xff0c;經常要到GitHub下載各種開源代碼&#xff0c;比如FFmpeg的源碼頁面位于https://github.com/FFmpeg/FFmpeg。然而國內訪問GitHub很不穩定&#xff0c;經常打不開該網站&#xff0c;比如在命令行執行下面的ping命令。 ping github.com 上面的ping結…

初識Linux:權限(1)

目錄 提示&#xff1a;以下指令均在Xshell 7 中進行 Linux 的權限 內核&#xff1a; 查看操作系統版本 查看cpu信息 查看內存信息 外部程序&#xff1a; 用戶&#xff1a; 普通用戶變為超級用戶&#xff1a; su 和 su-的區別&#xff1a; root用戶變成普通用戶&#…

KALI LINUX信息收集

預計更新 第一章 入門 1.1 什么是Kali Linux&#xff1f; 1.2 安裝Kali Linux 1.3 Kali Linux桌面環境介紹 1.4 基本命令和工具 第二章 信息收集 1.1 網絡掃描 1.2 端口掃描 1.3 漏洞掃描 1.4 社交工程學 第三章 攻擊和滲透測試 1.1 密碼破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

什么是SSL證書?

當我們網上購物或銀行業務時&#xff0c;為了安全起見&#xff0c;我們希望看到網站的地址欄上有“HTTPS”和安全鎖圖標。但是這個“HTTPS”和鎖定圖標實際上意味著什么&#xff1f;要回答這些問題&#xff0c;我們需要了解 HTTPS、SSL 協議和 SSL 證書。 關于HTTPS、SSL和SSL…

風控反欺詐安全學習路標

1. 金融和支付領域知識 - 了解金融和支付領域的基本概念、業務流程和風險特點。 - 學習金融機構的監管要求和合規措施&#xff0c;如KYC&#xff08;了解你的客戶&#xff09;和AML&#xff08;反洗錢&#xff09;。 2. 數據分析和挖掘技術 - 學習數據分析和數據挖掘的基本原理…

fastadmin獲取關聯表數據select渲染

php public function piliangadd(){if (false === $this->request->isPost()) {$fenlei_list = Db::name(fenlei)->order(weigh desc)->select();$this</

每天五分鐘計算機視覺:稠密連接網絡(DenseNet)

本文重點 在前面的課程中我們學習了殘差網絡ResNet,而DenseNet可以看成是ResNet的后續,我們看一下圖就可以看出二者的主要區別了。 特點 DenseNet是一種卷積神經網絡,它的特點是每一層都直接連接到所有后續層。這意味著,每一層都接收來自前一層的輸出,并將其作為輸入傳遞…

Flyway——Oracle創建前綴索引

文章目錄 前言創建一般索引的語法前綴索引 前言 索引有助于提升數據庫表的查詢速率&#xff0c;極大的縮減查詢的時間。但索引的創建需要考慮的因素很多&#xff0c;并非索引越多越好&#xff01; 創建一般索引的語法 oracle創建一般的常見索引&#xff0c;語法如下所示&…

n個人排成一圈,數數123離隊

#include<stdio.h> int main() { int i, n100,k0,j0,a[1000]{0};//k&#xff1a;數數123的變量&#xff0c;j記錄離開隊列人數的變量scanf("%d",&n);for(int ii0; ii<n; ii){ for( i0; i<n; i){// printf("wei%d ",i);if((a[i]0)&&…

掌握Line多開技術,打造私人專屬空間

掌握Line多開技術&#xff0c;打造私人專屬空間 在現代社交網絡的時代&#xff0c;人們經常需要同時處理多個社交賬號&#xff0c;例如工作、家庭、朋友等不同領域的社交關系。而對于Line這樣的主流社交應用來說&#xff0c;多開技術可以讓用戶更便捷地管理多個賬號&#xff0…

數據結構線性表-棧和隊列的實現

1. 棧(Stack) 1.1 概念 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧 頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;Last In First Out&#xff09;的原則。 …

Vue學習計劃-Vue2--Vue核心(三)methods和computed

Vue 1. 事件 v-on 基礎 使用 v-on:xxx或者xxx綁定事件&#xff0c;其中xxx是事件名 事件的回調需要配置在methods對象中&#xff0c;最終會在vm上 methods中配置函數&#xff0c;不要用箭頭函數&#xff0c;否則this就不是vm了 methods中配置函數&#xff0c;都是被Vue管…

Seata使用

本文以seata-server-1.5.2&#xff0c;以配置中心、注冊中心使用Nacos&#xff0c;store.modedb&#xff08;mysql&#xff09;為例進行操作。 一、Seata Server端 1、下載seata server 鏈接: http://seata.io/zh-cn/blog/download.html下載壓縮包&#xff0c;解壓至非中文目錄…

Java技術棧 —— 微服務框架Spring Cloud —— Ruoyi-Cloud 學習(一)

Ruoyi-cloud 項目學習 一、項目環境搭建與啟動1.1 nacos安裝部署1.1.1 nacos安裝、啟動1.1.2 nacos部署 1.2 seata安裝部署1.3 后端部署與運行1.3.1 ruoyi-modules-file模塊運行報錯 1.4 nginx安裝、部署、配置與啟動1.5 redis安裝與部署1.6 前段框架知識1.7 項目啟動1.8 參考 …

實用方法 | 搭建真正滿足用戶需求的在線幫助中心

隨著互聯網的普及和信息技術的快速發展&#xff0c;客戶服務和支持變得越來越重要。為了提高客戶滿意度和維持良好的品牌形象&#xff0c;越來越多企業都開始搭建自己的在線幫助中心。 不知從何下手&#xff1f;細想一下&#xff0c;搭建在線幫助中心主要就是為了解決用戶的問…

根據java類名找出當前是哪個Excel中的sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

shell_81.Linux在命令行中創建使用函數

在命令行中使用函數 在命令行中創建函數 兩種方法 單行方式來定義函數&#xff1a; $ function divem { echo $[ $1 / $2 ]; } $ divem 100 5 20 $ 當你在命令行中定義函數時&#xff0c;必須在每個命令后面加個分號&#xff0c;這樣 shell 就能知道哪里是命令的起止了&am…

反射實現tomcat

獲取類信息的方法 1.通過類對象 x.getClass() 2.通過class.forname方法 Class.forname(className);這里className是存儲類名的字符串 3.通過類名.class 類名.class 通過類名創建對象 類名.newInstance&#xff08;&#xff09;&#xff1b; 反射可以看到類的一切信息&#xff1…

C語言聯合和枚舉講解

目錄 聯合體的大小 聯合體如何省空間 巧用聯合體 聯合判斷大小端&#xff08;驚為天人&#xff0c;大佬寫的&#xff0c;我借鑒&#xff09; 枚舉 枚舉類型的使用 首先我們先看一下菜鳥教程中的對C語言聯合體的說明 聯合體的大小 #include <stdio.h> union u {char…