日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

LQ训练营(C++)学习笔记_栈与递归

發布時間:2023/12/15 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LQ训练营(C++)学习笔记_栈与递归 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧與遞歸

  • 二、棧與遞歸
    • 1、棧的概念
    • 2、代碼實現棧的數據結構
    • 3、棧stack< T >的方法總結
    • 4、火車出入站問題
    • 5、遞歸的概念
    • 6、遞歸方法求n的階乘
    • 7、漢諾塔問題

二、棧與遞歸

1、棧的概念

棧是滿足一定約束的線性數據結構,約束是:只允許在棧的一端插入或刪除元素,這一端被稱為棧頂,另一端稱為棧底。
向棧中壓入元素,稱為push;從棧頂彈出元素,稱為pop
棧的重要性質是先進先出:越早進入棧的元素,出來的時間越晚。
通常用top指示棧頂的位置。

2、代碼實現棧的數據結構

#include<iostream> using namespace std; struct Stack{//把數據結構封裝寫成stuck,便于代碼復用和調試int data[10000];int top = -1;//初始時棧中沒有元素,top值為-1void push(int x){//入棧top++;if(top < 10000){data[top] = x;}else{ //避免插入元素導致數組訪問越界而棧溢出top--;count <<"stack overflow" <<endl;}}void pop(){//出棧if(top >= 0){top--;}}int topval(){if(top >= 0){return data[top];//獲取當前棧頂元素的值}} }; int main(){Stack s;for(int i = 1; i <= 10; i++){s.push(i);}return 0; }

標準庫里面的stack在頭文件< stack >里面
stack< T > s定義一個存儲T類型數據的棧s。

3、棧stack< T >的方法總結

方法功能參數類型返回值類型
push壓入元素到棧頂T類型
pop彈出棧頂元素
top返回棧頂元素T類型
empty棧是否為空bool類型:false表示不為空,true表示棧為空
size棧的元素個數非負整數(size_t類型)

4、火車出入站問題

#include<iostream> #include<vector> #include<stack> using namespace std; int main(){int n;cin >> n;vector<int> a(n);for(int i = 0; i < n; i++){cin >> a[i];}stack<int> s;int cur = 1;//記錄當前沒有壓入棧中的元素的起始位置bool f = 1;for(int i = 0;i < n;i++){//如果棧頂不等于a[i],就一直向棧頂push元素while(s.empty()||s.top() != a[i] && cur <= n){s.push(cur);cur++;}if(s.empty() || s.top()!=a[i]){f = 0;break;}else{s.pop();}}if(f){cout << "legal" << endl;}else{cout << "illegal" << endl;}return 0; }

5、遞歸的概念

遞歸就是函數調用函數自身,用于解決有重復子問題的問題。
直接遞歸 求 n! ,n!=n*(n-1)!

int factorial(int n){return n * factorial(n - 1); }

6、遞歸方法求n的階乘

#include<iostream> using namespace std; long long factorial(int n){if(n <= 1){return 1;}return n * factorial(n-1); } int main(){int n;cin >> n;cout << factorial(n) << endl;return 0; }

7、漢諾塔問題

#include<iostream> #include<stack> using namespace std; stack<int> S[3]; void move(int x,int y){//棧x的top()移動到棧y的棧頂int temp = S[x].top();S[x].pop();S[y].push(temp);cout << x << "-->" << y << endl; } void hanio(int A,int b,int c,int n){//從A經B將n個盤子移到Cif(n == 1){//終止條件move(A,C);}hanio(A,C,B,n-1);move(A,C);hanio(B,A,C,n-1); } int main(){stack<int> S[3];int n;cin >> n;for(int i = n;i >= 1;i--){S[0].push(i);}hanio(0,1,2,n);while(!S[2].empty()){cout << S[2].top() << " ";S[2].pop();}return 0; }

總結

以上是生活随笔為你收集整理的LQ训练营(C++)学习笔记_栈与递归的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。