用鍊錶和大小可變的指標陣列實現多個棧的建立與操作

2021-10-04 19:22:28 字數 2922 閱讀 5356

朋友在刷pta遇到了這樣一道有意思的題:

實現起來不難,但是總是提示時間超限或記憶體超限。

這裡給出輸出入和輸出示例:

輸入

2215

11101

11112

121213

3121

21421

2121

2121

3212

2222

2373

1231

3321

2122

2323

輸出:

13

1211

10empty

14empty

empty

empty

empty

empty

empty

簡單的用二維陣列開闢好空間顯然是行不通的,因而選擇使用鍊錶:

typedef

struct stack

*sta,stack;

首先我們實現第乙個操作將資料存入鍊錶:

void

opera1

(sta head,

int n)

這裡直接採用了頭插法。這樣我們可以方便對棧頂進行操作。我們在實現第二種操作時就是利用這種特性:

void

opera2

(sta head)

}

接下來是方法3也是簡單的拼接操作,可以直接把鍊錶拼接到頭部降低時間複雜度:

void

opera3

(sta head1,sta head2)

if(i!=0)

}

為了降低其對空間的占用且符合規範,由於存在多組輸入我們要及時釋放記憶體:

void

destroy

(sta head)

}

sta* head=

null

;

接下來只要根據需要分配空間就可以了:

head=

(sta*

)malloc

(sizeof

(sta)

*n);

n為我們需要的頭結點數量。

main函式裡通過switch語言呼叫各個方法,同時為了避免空間浪費我們只在對應標號的棧被用到時建立頭結點。

接下來我們直接給出整個main函式的**:

int

main()

opera1

(head[s]

,v);

break

;case2:

scanf

("%d"

,&s)

; s--;if

(head[s]

==null

)//printf("%d",head[s]->next->n);

opera2

(head[s]);

break

;case3:

scanf

("%d %d"

,&h1,

&h2)

; h1--

; h2--;if

(head[h1]

==null)if

(head[h2]

==null

)opera3

(head[h2]

,head[h1]);

}}for(k=

0;kreturn0;

}

接下來我們給出整體**:

#include

#include

typedef

struct stack

*sta,stack;

void

opera1

(sta head,

int n)

void

opera2

(sta head)

}void

opera3

(sta head1,sta head2)

if(i!=0)

}void

destroy

(sta head)

}int

main()

opera1

(head[s]

,v);

break

;case2:

scanf

("%d"

,&s)

; s--;if

(head[s]

==null

)//printf("%d",head[s]->next->n);

opera2

(head[s]);

break

;case3:

scanf

("%d %d"

,&h1,

&h2)

; h1--

; h2--;if

(head[h1]

==null)if

(head[h2]

==null

)opera3

(head[h2]

,head[h1]);

}}for(k=

0;kreturn0;

}

用陣列和鍊錶實現棧

完成乙個棧總共需要完成以下操作 初始化入棧 出棧檢視棧頂元素 檢視棧的容量 清空棧。首先是簡單的,用陣列做的,會有越界的可能。include include typedef struct stack stack stack s 生成棧 void initstack 入棧,push void push...

用陣列實現鍊錶(C )

鍊錶可以說是最基本的資料結構,在常見的筆試,面試可能都會有涉及,本文是用陣列來實現鍊錶。其 實現如下 include using namespace std class list bool isempty int length int locate int x 返回表中元素x的位置 bool ret...

C語言用堆和雙向鍊錶實現可變長度陣列

最近,我在研究網路程式,突然發現c語言原生資料的乙個很要命的問題 必須提前宣告使用記憶體的長度。當然,c語言的這種要求是符合情理的,畢竟只有定長的變數才能放在函式的棧中。可是網路上的資料一般不具有預知性,有時很大上百m,有時很小,可能也就幾個位元組。於是,我想怎麼樣才能像其他語言那樣實現對資料的不限...