資料的存放方式,體現了資料結構
資料結構=資料+結構,結構指儲存、操作、關係。
若用set儲存,則需要用insert插入元素,因為set是一顆紅黑樹。
由於set裡面元素單調,可用\(o(\log)\)二分法查詢,
陣列:連續的一段儲存空間
可\(o(1)\)查詢特定編號的元素,
連結串列:鏈式結構
若動態指標實現,則可以做到:
struct node;
node *head;
核心**:
head=new node;
r=head;//r是一個工作指標,也就是“掃描頭”
while(cin>>x)
1.動態分配記憶體空間
2.快速插入一個節點
//在p和q之間插入數值x
node *r=new node;
r->data=x;
r->next=&q;
p.next=r;
若用靜態陣列來描述連結串列,則用\(data_i\)表示第i個元素的data值,用\(next_i\)表示第i個元素的下一個元素值
應用:鏈式前向星
struct nodev[nmax];
struct edgee[mmax];
實現:
void add(int u,int v,int w)
棧:filo
應用:進位制轉換,括號匹配,中綴表示式轉字尾
\(3*8-(6-2)/(3+4)\) ==> \(3,8,*,6,2,-,3,4,+,/,-\)
\(f(t)=-ce^+\intdt}\) ==>
\(t,f=-c,-k,t,*,exp,*,t,f_e,-k,t,*,exp,*,\int,+\)
表示式壓棧規則:
\(op(v)=\beginpop(),\text(v)
單調棧:
\(op(v)=\beginpop(),v
這樣棧裡的元素就是單調的了。
e.g.histogram
給出一個柱狀統計圖,他的每一個專案的寬度是1,高度和具體問題有關,求柱狀圖中最大長方形面積。
即:給定\(\\),求出\(ans=\max\limits_
其中\(h_=\min\limits_\leq}a_\)
int top=0,s[maxn];
int area=0;
for(int i=1;i<=n;i++)
e.g.求最長不下降子序列優化單調棧:\(\text(i,x)=\begin\text(i-1,x),v>s_i\\s_i=v,else\end\)
佇列:fifo
e.g.集合劃分
給定集合\(a=\\)和由01矩陣構成的衝突關係\(r_=\begin0,\text\\1,\text\end\),且\(r_=r_\),\(r_=0,i,j=1,2,...,n\),將\(a\)劃分成\(k\)個互不相交的子集,且對於任意子集\(a_i\)和\(x,y\in\),都有\(r_=0\),求出使得k最小的劃分方案。
分析:申請以下變數:
int r[nmax][nmax];//衝突矩陣
int newr[nmax];//工作陣列
int cq[nmax];//迴圈佇列
int result[nmax];//記錄分組數
int group=1;//記錄總共組數
工作過程:
\((1)\ cq_i\gets\quad newr\gets}\quad result\gets}\)
\((2)\ newr_i\gets}\)
\((3)\ v\gets}\quad cq.\text\)
\(\quad \text(v)=\begin\text(v),\quad r_=1\\newr_i\gets,\quad else\end\)
$(4)\ \mu \ \text\ cq \ \text $
e.g.滑動視窗