一、概述
- 栈
- 先进后出。
- 将元素放入栈中---入栈、压栈 ;将元素从栈中取出 --- 出栈、弹栈。
- 最先放入 栈中的元素--- 栈底元素;最后放入栈中的元素 --- 栈定元素。
- 基于Vactor。(参考:http://blog.youkuaiyun.com/chou_out_man/article/details/78053955)。
- 底层是数组。内存空间连续,查询较快,增删较慢。
二、方法摘要
- push() : 向栈中添加一个元素 --- 入栈
- pop() ; 移除栈顶元素 --- 出栈
- peek() : 获取栈顶元素但不移除
- search() ; 获取指定元素在栈中的位置 ,从栈顶开始找,基数为1。
public static void main(String[] args) { Stack<String> s = new Stack<String>(); //入栈 ,左边为栈底,右边为栈顶 s.push("a"); s.push("b"); s.push("c"); s.push("d"); System.out.println(s); //出栈 String str = s.pop(); System.out.println(str); //获取而不移除栈顶元素 String str1 = s.peek(); System.out.println(str1); System.out.println(s); //判断是否是一个空栈 System.out.println(s.isEmpty()); //获取元素在栈中出现的位置,查找元素时是从栈顶到栈底查找,以1为基数、 System.out.println(s.search("a")); }
2. 用数组实现Stack
1. /**
* 用Vector实现Stack
* */
public class Demo_01 {
public static void main(String[] args) {
jiazhuanStack1 j = new jiazhuanStack1();
//添加元素
j.push("a");
j.push("b");
j.push("c");
j.push("d");
System.out.println(j);
//弹出栈顶元素
j.pop();
System.out.println(j);
//读取栈顶元素但不弹出
String str = j.peek();
System.out.println(str);
System.out.println(j);
//判断是否时空栈
System.out.println(j.isEmpty());
//获取指定位置的元素
System.out.println(j.search("a"));
}
}
class jiazhuanStack1{
private Vector v;
public jiazhuanStack1() {
v= new Vector<String>();
}
//入栈
public void push (String str){
v.add(str);
}
//出栈
public void pop(){
v.remove(this.peek());
}
//获取栈顶元素而不移除
public String peek(){
if(v.isEmpty()){
throw new EmptyStackException();
}
return (String) v.lastElement();//返回栈顶元素
}
//判断是不是空
public boolean isEmpty(){
return v.isEmpty();
}
//获取指定元素的位置
public int search(String str ){
int index = -1;
int i = 0;
if(str==null){
return index;
}
Enumeration e = v.elements();
String str1 = null;
while(e.hasMoreElements()){
str1 = (String) e.nextElement();
if(str1.equals(str)){
break;
}
i++;
}
return i>=0? v.size() -i:index;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i =0;i<v.size();i++){
sb.append(v.get(i)+",");
}
String str = sb.toString();
str = str.substring(0,str.length()-1);
str+="]";
return str;
}
}
2.
/**
* 用数组实现 Stack
* */
public class Demo_02 {
public static void main(String[] args) {
jiazhuangStack2 j = new jiazhuangStack2();
//添加元素
j.push("a");
j.push("b");
j.push("c");
j.push("d");
System.out.println(j);
//弹出栈顶元素
j.pop();
System.out.println(j);
//读取栈顶元素但不弹出
String str = j.peek();
System.out.println(str);
System.out.println(j);
//判断是否时空栈
System.out.println(j.isEmpty());
//获取指定位置的元素
System.out.println(j.search("a"));
}
}
class jiazhuangStack2{
private String[] ss;
private int size;
public jiazhuangStack2() {
ss = new String[10];
size = 0;
}
//入栈
public void push(String str ){
if(str == null){
throw new NullPointerException();
}else if(size>=ss.length){
//数组扩容一倍
Arrays.copyOf(ss, ss.length<< 2);
}else{
ss[size] = str;
size++;
}
}
//出栈
public String pop(){
String str = this.peek();
size--;
return str;
}
//获取栈顶元素并不移除
public String peek(){
String str = null;
if(ss.length<0){
throw new EmptyStackException();
}else if(size<=0){
//System.out.println("栈中没有元素");
return str;
}else{
str = ss[size-1];
return str;
}
}
//判断是不是空栈
public boolean isEmpty(){
return size>0?false :true;
}
//获取指定元素的位置
public int search(String str){
for(int i = 0;i<size-1;i++){
if(ss[i].equals(str)){
return size - i;
}
}
return -1;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i =0;i<size;i++){
sb.append(ss[i]+",");
}
String str = sb.toString();
str = str.substring(0,str.length()-1);
str+="]";
return str;
}
}