栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。后进先出(Last In First Out),简称为LIFO线性表。
栈的基本操作共有六种:
- 构造栈并初始化:Stack();Stack(int initalSize);
- 判断空栈:isEmpty();
- 判断满栈:isFull();
- 入栈操作:push(E e);
- 出栈操作:pop();
- 取栈顶元素但不出栈: peek();
以下是源代码:
package linear;
/**
*基于数组实现的顺序栈
* @param <E>
*/
public class Stack<E>{
private Object[] data = null; //栈元素数组
private int Maxsize = 0; //栈容量
private int top = -1; //栈顶元素下标
public Stack()
{
init(20); //默认初始化大小为20的栈
}
public Stack(int initalSize)
{
init(initalSize);
}
//初始化栈
private void init(int initalSize)
{
if(initalSize >= 0){
this.Maxsize = initalSize;
data = new Object[Maxsize];
top = -1;
System.out.println("大小为"+Maxsize+"的栈初始化成功!");
}
else{
System.out.println("栈大小不能小于0:"+initalSize);
}
}
//判断栈是否为空
public boolean isEmpty(){
return top == -1 ? true : false;
}
//判断栈是否满
public boolean isFull(){
return top >= Maxsize-1 ? true : false;
}
//压栈操作
public boolean push(E e){
if( isFull() ){
System.out.println("栈已满,操作失败");
return false;
}
else{
top++;
data[top] = e;
System.out.println("元素‘"+e+"’入栈");
return true;
}
}
//出栈操作
@SuppressWarnings("unchecked")
public E pop(){
if( isEmpty() ){
System.out.println("空栈!操作失败");
return null;
}
else{
E e = (E)data[top];
data[top] = null; //元素出栈后数组该位置置空
top--;
return e;
}
}
//取栈顶元素但不出栈
@SuppressWarnings("unchecked")
public E peek(){
if( isEmpty() ){
System.out.println("栈为空!操作失败");
return null;
}
else{
return (E)data[top];
}
}
public static void main(String[] args) {
Stack<String> s = new Stack<String>();
s.push("鬼迷心窍");
s.push("爱的代价");
s.push("给自己的歌");
while(!s.isEmpty())
{
String str = s.pop();
System.out.println(str);
}
}
}
测试结果: