朋友在刷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,有時很小,可能也就幾個位元組。於是,我想怎麼樣才能像其他語言那樣實現對資料的不限...