棧和佇列的手動實現 用棧實現佇列 用佇列實現棧

2022-06-11 06:15:11 字數 2992 閱讀 4222

1、用陣列結構實現大小固定的棧和佇列

(1)棧:

public

static

class

arraystack

arr = new

integer[initsize];

size = 0;

}public

integer peek()

//返回棧頂元素但並不讓元素出棧

return arr[size - 1];

}public

void push(int

obj)

arr[size++] =obj;

}public

integer pop()

return arr[--size];}}

(2)佇列:

public

static

class

arrayqueue

arr = new

integer[initsize];

size = 0;

first = 0;

last = 0;

}public

integer peek()

return

arr[first];

}public

void push(int

obj)

size++;

arr[last] =obj;

last = last == arr.length - 1 ? 0 : last + 1;

}public

integer poll()

size--;

int tmp =first;

first = first == arr.length - 1 ? 0 : first + 1;

return

arr[tmp];}}

2、實現乙個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。

【要求】

1.pop、push、getmin操作的時間複雜度都是o(1)。

2.設計的棧型別可以使用現成的棧結構。

【思路】

根據要求1,由棧先進後出的特性,我們可以判斷乙個棧是滿足不了需求的,此時需使用兩個棧,乙個data棧儲存資料,乙個min棧儲存最小元素。當需要返回棧中最小元素的操作時,將min棧棧頂元素返回即可。

【code】

public

static

class

mystack1

public

void push(int

newnum)

else

if (newnum <= this

.getmin())

this

.stackdata.push(newnum);

}public

intpop()

int value = this

.stackdata.pop();

if (value == this

.getmin())

return

value;

}public

intgetmin()

return

this

.stackmin.peek();}}

3、僅用佇列結構實現棧結構

【思路】

使用兩個佇列,乙個佇列名為主佇列,乙個佇列名為help的輔助佇列,模擬進棧操作即入主佇列,當需模擬出棧時,將主佇列元素一一出隊併入help佇列,當出最後乙個元素時將其返回,完成出棧操作,並將help佇列名轉化為主佇列,原本的主佇列此時已無元素,轉換成help佇列。

【code】

public

static

class

twoqueuesstack

public

void push(int

pushint)

public

intpeek()

while (queue.size() != 1)

int res =queue.poll();

help.add(res);

swap();

return

res;

}public

intpop()

while (queue.size() != 1)

int res =queue.poll();

swap();

return

res;

}private

void

swap()

}

4、僅用棧結構實現佇列

【思路】

與上述一樣也需要兩個棧,乙個棧名為push棧,當入佇列時需要用到;乙個棧名為pop棧,當出佇列時需要用到。當需要出佇列時,先檢查pop棧有無元素,如無則push棧將全部元素出棧並將出棧元素一一壓入pop棧,此時返回pop棧頂元素,即為出隊操作。

這裡需注意兩個規則,規則一:pop棧有內容時push棧不能往裡倒元素。規則二:當pop棧無元素,push棧要往裡倒元素時,需將元素一次性全部倒入。否則違背佇列規則。

【code】

public

static

class

twostacksqueue

public

void push(int

pushint)

public

intpoll()

else

if(stackpop.empty())

}return

stackpop.pop();

}public

intpeek()

else

if(stackpop.empty())

}return

stackpop.peek();}}

佇列的特殊實現 用棧實現佇列

用棧實現佇列這種方式我是想不到的,不過卻是很容易理解的一種方式。她其實是組合使用了兩個棧的 後進先出 來實現佇列的 先進先出 這樣實現的佇列,其操作的時間複雜度為o 1 演算法的實現思路 準備兩個用於棧實現佇列 instack和outstack 1 當有新元素入隊時 將其壓入instack 中 2 ...

佇列實現棧棧實現佇列

佇列是一種先進先出的資料結構,要想實現先進後出,需加乙個輔助佇列進行資料的來回倒 引用交換 從而實現棧結構。例如 5 4 3 2 1 用乙個輔助佇列裝 4 3 2 1,把5彈出,在把 4 3 2 1放回原佇列,如此反覆可變成5 4 3 2 1的棧結構。棧是一種先進後出的資料結構,要想實現先進先出,同...

佇列實現棧,棧實現佇列

兩個佇列實現棧 每次進入乙個佇列,取出得時候,把所有元素進入另乙個佇列,只留下乙個元素,以此實現棧的先進後出 filo package algorithmbymyself import j a.util.linkedlist import j a.util.queue 用兩個佇列實現乙個棧 publ...