棧定義
棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。
對棧來說,表尾端有其特殊含義,稱爲棧頂(top),相應地表頭端稱爲棧底(bottom)。不含元素的空表稱爲空棧。
棧的修改是按後進先出的原則進行的,因此,棧又稱爲後進先出(Last in first out)的線性表(簡稱LIFO結構)。
棧的屬性與方法
Java程序代碼實現
public interface IMyStack<T> {
/*
* 入棧
*/
boolean push(T data);
/*
* 出棧
*/
T pop();
/*
* 棧的長度
*/
int length();
/*
* 棧是否爲空
*/
boolean isEmpty();
/*
* 清空棧
*/
void clear();
}
棧的順序表示
定義:
順序棧:即棧的順序存儲結構是利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針(top)指示棧頂元素在順序棧中的位置。
代碼:
java程序代碼實現
public class MyArrayStack<T> implements IMyStack<T> {
private Object[] objs = new Object[16];
private int size;
@Override
public boolean push(T data) {
if(size >= objs.length){
addLength();
}
objs[size++]=data;
return true;
}
@SuppressWarnings("unchecked")
@Override
public T pop() {
if(size==0){
return null;
}
return (T) objs[--size];
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void clear() {
for (int i = 0; i < size; i++) {
objs[i] = null;
}
size = 0;
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("MyArrayStack:[");
for (int i = 0; i < size; i++) {
sb.append(objs[i]);
if(i != size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
/*
* 擴容數組
*/
private void addLength() {
Object[] temp = new Object[size*3/2+1];
for(int i=0; i<size; i++){
temp[i] = objs[i];
objs[i] = null;
}
objs = temp;
}
}
棧的鏈式表示
定義:
鏈棧用鏈表作爲存儲結構,棧初始化時僅需給棧頂指針分配內存空間,而後每當有數據入棧時再爲該數據分配空間,這樣實現了內存空間的動態分配。
代碼:
java程序代碼實現
public class MyLinkedStack<T> implements IMyStack<T> {
/*
* 棧頂指針
*/
private Node<T> top;
/*
* 棧的大小
*/
private int size;
public MyLinkedStack() {
this.top = null;
this.size = 0;
}
@Override
public boolean push(T data) {
Node<T> node = new Node<T>(data);
node.next = top;
// 修改棧頂指針
top = node;
size++;
return true;
}
@Override
public T pop() {
if(top == null){
return null;
}
Node<T> node = top;
// 修改棧頂指針
top=node.next;
size--;
return node.data;
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void clear() {
top = null;
size = 0;
}
}
棧定義
棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。
對棧來說,表尾端有其特殊含義,稱爲棧頂(top),相應地表頭端稱爲棧底(bottom)。不含元素的空表稱爲空棧。
棧的修改是按後進先出的原則進行的,因此,棧又稱爲後進先出(Last in first out)的線性表(簡稱LIFO結構)。
棧的屬性與方法
Java程序代碼實現
public interface IMyStack<T> {
/*
* 入棧
*/
boolean push(T data);
/*
* 出棧
*/
T pop();
/*
* 棧的長度
*/
int length();
/*
* 棧是否爲空
*/
boolean isEmpty();
/*
* 清空棧
*/
void clear();
}
棧的順序表示
定義:
順序棧:即棧的順序存儲結構是利用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素,同時附設指針(top)指示棧頂元素在順序棧中的位置。
代碼:
java程序代碼實現
public class MyArrayStack<T> implements IMyStack<T> {
private Object[] objs = new Object[16];
private int size;
@Override
public boolean push(T data) {
if(size >= objs.length){
addLength();
}
objs[size++]=data;
return true;
}
@SuppressWarnings("unchecked")
@Override
public T pop() {
if(size==0){
return null;
}
return (T) objs[--size];
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void clear() {
for (int i = 0; i < size; i++) {
objs[i] = null;
}
size = 0;
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("MyArrayStack:[");
for (int i = 0; i < size; i++) {
sb.append(objs[i]);
if(i != size-1){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
/*
* 擴容數組
*/
private void addLength() {
Object[] temp = new Object[size*3/2+1];
for(int i=0; i<size; i++){
temp[i] = objs[i];
objs[i] = null;
}
objs = temp;
}
}
棧的鏈式表示
定義:
鏈棧用鏈表作爲存儲結構,棧初始化時僅需給棧頂指針分配內存空間,而後每當有數據入棧時再爲該數據分配空間,這樣實現了內存空間的動態分配。
代碼:
java程序代碼實現
public class MyLinkedStack<T> implements IMyStack<T> {
/*
* 棧頂指針
*/
private Node<T> top;
/*
* 棧的大小
*/
private int size;
public MyLinkedStack() {
this.top = null;
this.size = 0;
}
@Override
public boolean push(T data) {
Node<T> node = new Node<T>(data);
node.next = top;
// 修改棧頂指針
top = node;
size++;
return true;
}
@Override
public T pop() {
if(top == null){
return null;
}
Node<T> node = top;
// 修改棧頂指針
top=node.next;
size--;
return node.data;
}
@Override
public int length() {
return size;
}
@Override
public boolean isEmpty() {
return size==0;
}
@Override
public void clear() {
top = null;
size = 0;
}
}