874
技術社區[雲棲]
數據結構之棧與隊列
一。棧1。概念:棧(stack)是一種線性數據結構,隻能訪問它的一端來存儲或者讀取數據。棧是一種後進先出的結構(LIFO)
2。棧的主要操作:
.clear()——清棧
.isEmpty()——檢查棧是否為空
.push(e)——壓棧
.pop()——出棧
.topEl()——返回棧頂元素
3。棧的java實現:使用數組鏈表實現

/** *//**
*
*/
package com.sohu.blog.denns_zane.stackqueue;

/** *//**
* @author dennis
*
*/
public abstract class AbstractStack
{
public abstract Object pop();
public abstract void push(Object obj);
public abstract Object topEl();
public abstract boolean isEmpty();
public abstract void clear();
}


/** *//**
*
*/
package com.sohu.blog.denns_zane.stackqueue;

/** *//**
* @author dennis
*
*/
public class Stack extends AbstractStack
{
private java.util.ArrayList pool = new java.util.ArrayList();

public Stack()
{
}

public Stack(int n)
{
pool.ensureCapacity(n);
}

public void clear()
{
pool.clear();
}

public boolean isEmpty()
{
return pool.isEmpty();
}

public Object topEl()
{
if (isEmpty())
throw new java.util.EmptyStackException();
return pool.get(pool.size() - 1);
}

public Object pop()
{
if (isEmpty())
throw new java.util.EmptyStackException();
return pool.remove(pool.size() - 1);
}

public void push(Object el)
{
pool.add(el);
}

public String toString()
{
return pool.toString();
}
}
4。棧的應用:
1)程序中的匹配分割符,如(,[,{等符號
2)大數的運算,比如大數相加,轉化為字符串,利用棧處理
3)回文字,例子:

/** *//**
*
*/
package com.sohu.blog.denns_zane.stackqueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/** *//**
* @author dennis
*
*/
public class HuiWen
{

/** *//**
* @param args
*/
public static void main(String[] args)
{
BufferedReader buffer = new BufferedReader(new InputStreamReader(
System.in));
try
{
String str = buffer.readLine();
if (str != null)
isHuiWen(str);

} catch (IOException e)
{
e.printStackTrace();
}
// TODO Auto-generated method stub
}

public static void isHuiWen(String str)
{
int length = str.length();
char[] ch = str.toCharArray();
Stack stack = new Stack();
if (length % 2 == 0)
{
for (int i = 0; i < length / 2; i++)
{
stack.push(ch[i]);
}
for (int i = length / 2; i < length - 1; i++)
{
if (ch[i] != ((Character) stack.pop()).charValue())
{
System.out.println("不是回文字!!");
return;
}
}
System.out.println(str + "是回文字!!");
} else
{
for (int i = 0; i < length / 2; i++)
{
stack.push(ch[i]);
}
for (int i = (length / 2 + 1); i < length - 1; i++)
{
if (ch[i] != ((Character) stack.pop()).charValue())
{
System.out.println("不是回文字!!");
return;
}
}
System.out.println(str + "是回文字!!");
}
}
}
4)java虛擬機中的本地方法棧
二。隊列(queue)
1。概念:隊列也是線性結構,從尾部添加元素,從頭部刪除元素。與棧相反,隊列是先入先出結構(FIFO)
2。隊列主要操作:
.clear() ——清空隊列
.isEmpty()——判斷隊列是否為空
.enqueue(el)——從尾部插入元素el
.dequeue()——從隊列中起出第一個元素,並刪除
.firstEl()——返回隊列第一個元素,不刪除。
3。隊列的實現:
1)環形數組:需要考慮隊列已滿的兩種情況,1,第一個元素在最後一個元素之後;2,第一個元素在第一單元,最後一個元素在最後單元。給出一個java實現:

/** *//**
*
*/
package com.sohu.blog.denns_zane.stackqueue;

/** *//**
* @author dennis
*
*/
// queue implemented as an array
public class ArrayQueue
{
private int first, last, size;
private Object[] storage;

public ArrayQueue()
{
this(100);
}

public ArrayQueue(int n)
{
size = n;
storage = new Object[size];
first = last = -1;
}

public boolean isFull()
{
return first == 0 && last == size - 1 || first == last + 1;
}

public boolean isEmpty()
{
return first == -1;
}

public void enqueue(Object el)
{
if (last == size - 1 || last == -1)
{
storage[0] = el;
last = 0;
if (first == -1)
first = 0;
} else
storage[++last] = el;
}

public Object dequeue()
{
Object tmp = storage[first];
if (first == last)
last = first = -1;
else if (first == size - 1)
first = 0;
else
first++;
return tmp;
}

public void printAll()
{
for (int i = 0; i < size; i++)
System.out.print(storage[i] + " ");
}
}
2)更適合實現隊列的雙向鏈表:
/** *//**
*
*/
package com.sohu.blog.denns_zane.stackqueue;

/** *//**
* @author dennis
*
*/
public class Queue
{
private java.util.LinkedList list = new java.util.LinkedList();

public Queue()
{
}

public void clear()
{
list.clear();
}

public boolean isEmpty()
{
return list.isEmpty();
}

public Object firstEl()
{
return list.getFirst();
}

public Object dequeue()
{
return list.removeFirst();
}

public void enqueue(Object el)
{
list.add(el);
}

public String toString()
{
return list.toString();
}

}
文章轉自莊周夢蝶 ,原文發布時間5.17
4。隊列的應用:線性規劃方麵
最後更新:2017-05-17 11:36:28
上一篇:
算法之簡單排序
下一篇:
歡迎加入阿裏雲雲HBase技術交流群
上帝的巴別塔在崩塌?阿裏翻譯一年2500億次調用,節省25億美元
Elasticsearch 使用中文分詞
《新編計算機科學概論》一0.2 計算機的曆史
雲架構和openstack的思考
cc End Of The World 2
《vSphere性能設計:性能密集場景下CPU、內存、存儲及網絡的最佳設計實踐》一1.1.3 評估物理性能
[數據庫]ROW_NUMBER() OVER函數的基本用法
Flume-ng出現HDFS IO error,Callable timed out異常
Tomcat啟動報錯:java.lang.IllegalArgumentException: Can't convert argument:null
《WCF技術剖析》博文係列匯總[持續更新中]