棧的主要機制可以用陣列來實現,也可以用鍊錶來實現,下面用陣列來實現棧的基本操作:
public
class
arraystack
public
void
push(
long
value)
a[++top] = value;
} public
long
peek()
return
a[top];
} public
long
pop()
return
a[top--];
} public
intsize()
public
boolean
isempty()
public
boolean
isfull()
public
void
display()
system.out.println(""
);
} }
資料項入棧和出棧的時間複雜度均為o(1)。這也就是說,棧操作所消耗的時間不依賴於棧中資料項的個數,因此操作時間很短。棧不需要比較和移動操作。
佇列也可以用陣列來實現,不過這裡有個問題,當陣列下標滿了後就不能再新增了,但是陣列前面由於已經刪除佇列頭的資料了,導致空。所以佇列我們可以用迴圈陣列來實現,見下面的**:
public
class
roundqueue
public
void
insert(
long
value)
rear = ++rear % size;
a[rear] = value; //尾指標滿了就迴圈到0處,這句相當於下面注釋內容
nitems++;
/* if(rear == size-1)
a[++rear] = value;
*/}
public
long
remove()
nitems--;
front = front % size;
return
a[front++];
} public
void
display()
intitem = front;
for(
inti =
0; i < nitems; i++)
system.out.println(""
);
} public
long
peek()
return
a[front];
} public
boolean
isfull()
public
boolean
isempty()
public
intsize()
}
和棧一樣,佇列中插入資料項和刪除資料項的時間複雜度均為o(1)。
還有個優先順序佇列,優先順序佇列是比棧和佇列更專用的資料結構。優先順序佇列與上面普通的佇列相比,主要區別在於佇列中的元素是有序的,關鍵字最小(或者最大)的資料項總在隊頭。資料項插入的時候會按照順序插入到合適的位置以確保佇列的順序。優先順序佇列的內部實現可以用陣列或者一種特別的樹——堆來實現。堆可參考第8節內容。這裡用陣列實現優先順序佇列。
public
class
priorityqueue
public
void
insert(
long
value)
intj;
if(nitems ==
0)
else
else
} a[j+1
] = value;
nitems++;
} }
public
long
remove()
return
a[--nitems];
} public
long
peekmin()
public
boolean
isfull()
public
boolean
isempty()
public
intsize()
public
void
display()
system.out.println(" "
);
} }
這裡實現的優先順序佇列中,插入操作需要o(n)的時間,而刪除操作則需要o(1)的時間。在第8節裡將介紹堆來改進插入操作的時間。
資料結構與演算法02 之棧與佇列
棧的主要機制可以用陣列來實現,也可以用鍊錶來實現,下面用陣列來實現棧的基本操作 public class arraystack public void push long value a top value public long peek return a top public long pop ...
資料結構與演算法 棧 02
棧 先進後出 陣列來實現棧的基本操作 author fancy date 2018 12 05 09 31 public class arraystack 壓入資料 author fancy param value public void push int value array topindex ...
資料結構與演算法(棧與佇列)
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,他的特點在於只能允許在容器的一端 稱為棧頂端指標,英語top 進行加入資料 英語push 和輸出資料 英語pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問...