STL,sort排序,棧和遞迴,以及漢諾塔問題

2021-09-13 11:18:19 字數 3675 閱讀 7519

僅供參考:

#include

#include

#include

#include

//陣列

#include

//集合

#include

//對映

#include

//包含map中的make_pair()函式

#include

//包含sort排序

#include

using namespace std;

stack<

int> s[3]

;void

move

(int a,

int b)

void

han(

int a,

int b,

int c,

int n)

han(a,c,b,n-1)

;move

(a,c)

;han

(b,a,c,n-1)

;}typedef

long

long ll;

ll f

(int n)

//n的階乘

return n*

f(n-1)

;}intfib

(int n)

//斐波那契數列//1,1,2,3,5,8

struct student

;int

main()

for(i=

0;i) cout<} vector<

int>

temp

(n);

//兩種初始化 第二個引數預設為零

vector<

int>

temp2

(n,5);

vector class1;

//存放結構體

student stu1,stu2;

stu1.name=

"jsdokl"

; stu1.age=45;

stu2.name=

"sjdf"

; stu2.age=34;

class1.

push_back

(stu1)

; class1.

push_back

(stu1)

; vector<

int> vec;

vec.

push_back(3

);//尾部插入

vec.

push_back(5

);vec.

push_back(1

);vec[0]

=4;//可直接手改

vec.

pop_back()

;//尾部刪除

for(i=

0;isize()

;i++

)//取長度

vectorint>

> dd;

for(i=

0;i<

9;i++

)for

(i=0

;i<

9;i++

)//九九乘法表

}for

(i=0

;isize()

;i++

) cout<} class1.

clear()

;//清空資料,記憶體還在

/*******************set********************/

set name;

name.

insert

("dshfl");

//插入

name.

insert

("dklv");

name.

insert

("sovj");

name.

erase

("sovj");

//刪除

if(name.

count

("dklv"))

//查詢 返回1,0

for(set

::iterator it=name.

begin()

;it!=name.

end(

);it++

) name.

clear()

;//清空set記憶體

cout

/*******************map***********************/

mapint> s;

s.insert

(make_pair

("niuge",3

));//第一種插入

s["chenl"]=

1;//第二種插入

s["dsjfkl"]=

2;s["sldkjf"]=

2;if(s.

count

("chenl"))

//查詢

for(mapint>

::iterator it=s.

begin()

;it!=s.

end(

);it++

) s.

clear()

;/*******************sort排序***********************/

int i;

int arr=

;sort

(arr,arr+10)

;//小到大

for(i=

0;i<

10;i++

) cout

(arr,arr+

10,greater<

int>()

);//大到小

for(i=

0;i<

10;i++

) cout

stack name;

name.

push

("slkf");

//壓入棧底

name.

push

("jlksdf");

name.

push

("skfdj");

name.

push

("s");

name.

push

("sdjl");

while

(!name.

empty()

)//判斷是否為空 bool型別

cout

;/*******************遞迴***********************/

//遞迴問題解決重複子問題

//ll a=4038509223897348975;

//cout//printf("%lld\n",a);

//coutint n;

cin>>n;

for(

int i=n;i>=

1;i--

)han(0

,1,2

,n);

while

(!s[2]

.empty()

)return0;

}

去除尾遞迴的快速排序以及快速排序的棧深度

對於棧深度的定義 編譯器通常使用棧來儲存遞迴執行過程中的相關資訊,包括每次遞迴呼叫的引數等。最新呼叫的資訊存在棧的頂部,而第一次呼叫的資訊存在棧的底部。當乙個過程被呼叫時,其相關資訊被壓如棧中,當它結束時,其資訊被彈出。棧深度是在一次計算中會用到的棧空間的最大值。對於快速排序,假設陣列引數的傳遞是用...

快速排序c語言遞迴和棧實現

用到乙個方法,交換兩個數的值 void swap int a,int b 遞迴實現 void quicksortbyrecursion int p,int length 傳遞陣列指標跟陣列長度 swap p,right 把第乙個值跟righ對應的值交換,此時right指向小於中間值的最後乙個數 qu...

遞迴和棧溢位。

遞迴確實是很多演算法的基礎思想。但外部因素導致遞迴會棧溢位。但卻是不甘心如此簡練的有效的演算法,放棄不用。所以一般有2中方式來使用大資料的遞迴思路 1 用棧型別放入引數,模擬遞迴呼叫。2 把大資料分割為一批適中的資料,就可以直接使用遞迴函式。用快速排序,測試並總結了下。1 本例大概 排序30000個...