棧:是一種特殊的線性表,只允許在固定的一端插入和刪除,一端稱為棧底,一端稱為棧頂。棧遵循先進後出的原則。
棧的相關操作:壓棧,向棧頂插入乙個元素
出棧,在棧頂處刪除乙個元素
取棧頂元素,獲取到在最後乙個在棧頂元素的結果。
棧的實現:
1.基於順序表:
使用尾插,尾刪來分別表示入棧和出棧。根據下標獲取元素表示取棧頂元素
實現**:
public
class
mystack
//出棧
public integer pop()
int ret=arr[size-1]
; size--
;return ret;
}//取棧頂元素
public integer peek()
int ret=arr[size-1]
;return ret;
}}
2.基於鍊錶
使用頭插,頭刪來表示入棧和出棧。直接取頭結點就是取棧頂元素。
實現**
class
node
}public
class
mylinkedstack
//棧不為空
newnode.next=head;
head=newnode;
}//出棧
public integer pop()
if(head.next==null)
int ret=head.val;
head=head.next;
return ret;
}//取棧頂元素
public integer peek()
return head.val;
}}
佇列:只允許在一端進行插入,在另一端進行刪除操作的特殊線性表。佇列遵循先進先出的原則。
佇列的操作:入佇列:在隊尾進行插入操作
出佇列:在隊頭進行刪除操作
佇列的實現:
通過鍊錶:
使用尾插表示入佇列,使用頭刪表示出佇列。直接獲取到頭結點,就是取隊頭元素。
實現**:
class
node
}public
class
myqueue
//不為空
tail.next=newnode;
tail=tail.next;
return
true;}
//出佇列
public integer poll()
int ret = head.val;
if(head.next == null)
head=head.next;
return ret;
}//取隊頭元素
public integer peek()
return head.val;
}}
基於順序表實現迴圈佇列:
佇列的有效元素區間:[head,tail)
迴圈佇列和普通佇列的區別,只是隊頭隊尾可以重新從0開始往後移動。相比於鍊錶版的佇列,操作速度更快,但空間是固定大小的,擴容成本高。
入佇列操作:把新的元素放到tail對應的下標上,同時tail++
出佇列操作:head++ ,相當於把原來head指向的元素排除到有效區間外。
缺陷:隊列為空時,tail和head是重合的。隊列為滿時,tail和head也是重合的,所以無法正確判斷當前的佇列是空還是滿。
這個問題的解決方案:1.留出乙個元素大小的空間,這樣當隊列為滿時,tail和head不會重合,可以判斷為滿。tail==head-1即隊列為滿。
2.設定size屬性,通過操作size來判斷佇列是否空或滿。
public
class
myqueue2
data[tail]
=val;
tail++;if
(tail==data.length)
size++
;return
true;}
//出佇列
public integer poll()
int ret=data[head]
; head++;if
(head==data.length)
size--
;return ret;
}//取隊頭元素
public integer peek()
return data[head];}
}
實現棧和佇列
一 棧的實現 入棧 出棧 取棧頂元素 順序表實現棧操作 實現 public class mystack data size val size 2.出棧 public integer pop integer result data size 1 size return result 3.取棧頂元素 p...
c 棧,佇列,迴圈佇列 簡單實現
棧 include using namespace std template struct node template class stack bool push const t e const t pop const t gtop bool empty int size bool clear pr...
佇列實現棧棧實現佇列
佇列是一種先進先出的資料結構,要想實現先進後出,需加乙個輔助佇列進行資料的來回倒 引用交換 從而實現棧結構。例如 5 4 3 2 1 用乙個輔助佇列裝 4 3 2 1,把5彈出,在把 4 3 2 1放回原佇列,如此反覆可變成5 4 3 2 1的棧結構。棧是一種先進後出的資料結構,要想實現先進先出,同...