資料結構與演算法學習task03

2021-10-02 02:29:27 字數 3398 閱讀 2670

用陣列實現乙個順序棧。

0.1 棧的定義

插入(入棧)和刪除(出棧)操作只能在一端(棧頂)進行的線性表。即先進後出(first in last out)的線性表。

例1 :線性表(a0,a1,…,an) 進棧與出棧演示。

如上所示,棧有兩種實現一種是順序棧一種是鏈棧,這兩種實現方式有什麼區別呢,其實與順序表和煉表是一樣的:

順序棧是靜態分配的但是鏈棧是動態分配的,所以比較起來鏈棧對於空間的利用率更高。因為順序棧可能申請了較大的空間但是並沒有全部都儲存元素。

順序棧雖然不用儲存指標相比較鏈棧來說較為節省記憶體空間,但是鏈棧卻可以將零碎的記憶體空間利用起來。

而且對於儲存量未知的情況下,鏈棧更加適合,因為鏈棧通常不會出現棧滿的情況。

對於順序表和煉表來說,鍊錶對於插入和刪除效率更高,順序表對於查詢效率更高。但是對於棧來說只能在棧頂進行操作,所以無法體現鍊錶的效率更高。

0.2 棧的操作

入棧操作:將資料元素值插入棧頂。

出棧操作:移除棧頂的資料元素。

是否為空:判斷棧中是否包含資料元素。

得到棧深:獲取棧中實際包含資料元素的個數。

清空操作:移除棧中的所有資料元素。

獲取棧頂元素。

用鍊錶實現乙個鏈棧。

理解遞迴的原理。

如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。

sample:斐波那契數列

f(n)

=f(n-1)

+f(n-2)

, f(0)

=0 f(1)

=1迴圈:以下**為python版本:

i =0

j =1

lst =

list

([i, j]

)for k in

range(2

,11):

k = i + j

i = j

j = k

print

(lst)

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

遞迴:以下**為python版本:

defrecur_fibo

(n):

if n <=1:

return n

return recur_fibo(n -1)

+ recur_fibo(n -2)

lst =

list()

for k in

range(11

):)print

(lst)

# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

根據要求完成車輛重排的程式**

假設一列貨運列車共有n節車廂,每節車廂將停放在不同的車站。假定n個車站的編號分別為1至n,貨運列車按照第n站至第1站的次序經過這些車站。車廂的編號與它們的目的地相同。為了便於從列車上卸掉相應的車廂,必須重新排列車廂,使各車廂從前至後按編號1至n的次序排列。當所有的車廂都按照這種次序排列時,在每個車站只需卸掉最後一節車廂即可。

我們在乙個轉軌站裡完成車廂的重排工作,在轉軌站中有乙個入軌、乙個出軌和k個緩衝鐵軌(位於入軌和出軌之間)。圖(a)給出乙個轉軌站,其中有k個(k=3)緩衝鐵軌h1,h2 和h3。開始時,n節車廂的貨車從入軌處進入轉軌站,轉軌結束時各車廂從右到左按照編號1至n的次序離開轉軌站(通過出軌處)。在圖(a)中,n=9,車廂從後至前的初始次序為5,8,1,7,4,2,9,6,3。圖(b)給出了按所要求的次序重新排列後的結果。

編寫演算法實現火車車廂的重排,模擬具有n節車廂的火車「入軌」和「出軌」過程。

// re-arrangement of train.cpp : 

//#include

"stdafx.h"

#include

#include

#include

#include

#include

#include

using

namespace std;

//輔函式update:更新緩衝鐵軌上的min_buf(緩衝鐵軌上最小的車廂號)、min_tra(最小的車廂所在的緩衝鐵軌編號)

void

updata

(vector

int>>

& tracks_buf,

int& min_buf,

int& min_tra)}}

//輔函式trans:將車廂移到緩衝鐵軌上

bool

trans

(int n,

int d, vector

int>>

& tracks_buf,

int& min_buf,

int& min_tra)}if

(-1!= prefer_track)

//找到最優緩衝鐵軌

else

}//否則返回false;

return

false;}

}/* 火車車廂重排問題

* datas:火車車廂在入軌上時的序列

* n : 火車車廂的總節數

* k :緩衝鐵軌的條數

*///主要函式

bool

fun(vector<

int>

&datas, deque<

int>

& results,

int n,

int k)

}else

//不符合要求移到緩衝鐵軌上}}

return

true;}

intmain()

; deque<

int> results;

vector<

int>

vec(array, array +

sizeof

(array)

/sizeof

(array[0]

));int n = vec.

size()

;int k =3;

//3條緩衝鐵軌if(

fun(vec, results, n, k)

)else

}

參考:

資料結構與演算法學習

我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...

資料結構與演算法學習筆記

演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...

資料結構與演算法學習二

1 用js中object物件模擬集合set的資料結構 set集合中的資料結構 s s 即集合中的鍵 值相同。故,可令object物件中的鍵 值相同,來模擬set集合及其中的方法,如下 用js中object模擬實現集合set資料結構 es6中有set類,避免混淆這裡用set2 var set2 fun...