佇列
public inte***ce mystackextends iterable
public class arraystackimplements mystack
@override
public item pop() throws exception
item item = a[--n];
check();
// 避免物件游離
a[n] = null;
return item;
}private void check() else if (n > 0 && n <= a.length / 4)
}/**
* 調整陣列大小,使得棧具有伸縮性
*/private void resize(int size)
a = tmp;
}@override
public boolean isempty()
@override
public int size()
@override
public iteratoriterator()
@override
public item next() };}
}
需要使用鍊錶的頭插法來實現,因為頭插法中最後壓入棧的元素在鍊錶的開頭,它的 next 指標指向前乙個壓入棧的元素,在彈出元素時就可以通過 next 指標遍歷到前乙個壓入棧的元素從而讓這個元素成為新的棧頂元素。
public class liststackimplements mystack
@override
public mystackpush(item item)
@override
public item pop() throws exception
item item = top.item;
top = top.next;
n--;
return item;
}@override
public boolean isempty()
@override
public int size()
@override
public iteratoriterator()
@override
public item next() };}
}
下面是佇列的鍊錶實現,需要維護 first 和 last 節點指標,分別指向隊首和隊尾。
這裡需要考慮 first 和 last 指標哪個作為鍊錶的開頭。因為出佇列操作需要讓隊首元素的下乙個元素成為隊首,所以需要容易獲取下乙個元素,而鍊錶的頭部節點的 next 指標指向下乙個元素,因此可以讓 first 指標鍊錶的開頭。
public inte***ce myqueueextends iterable
public class listqueueimplements myqueue
@override
public boolean isempty()
@override
public int size()
@override
public myqueueadd(item item) else
n++;
return this;
}@override
public item remove() throws exception
node node = first;
first = first.next;
n--;
if (isempty())
return node.item;
}@override
public iteratoriterator()
@override
public item next() };}
}
棧和佇列演算法
1 實現乙個棧,要求實現push 出棧 pop 入棧 min 返回最小值 的時間 複雜度為o 1 方法1 使用乙個棧實現,交叉棧 pragma once include define max value 100 typedef struct minstackminstack 實現乙個棧,要求實現pu...
演算法 佇列和棧
雙端佇列的首部和尾部都可以亞壓入元素 public class statck stacktest array public static void stacktest int array else else data.push array i system.out.println 每一步棧的最小值 ...
演算法專題 棧和佇列
在j a中棧使用arraydeque和linkedlist,這兩個集合類既實現了list介面,也實現了deque介面。因此以上集合類可以當棧也可以當雙端佇列使用。1 使用兩個棧完成getmin功能,分別為data棧和min棧 壓入規則 將資料壓入data棧,判斷min棧是否為空 彈出規則 將data...