用陣列實現乙個順序棧。
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...