大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
栈数组实现一:优点:入栈和出栈速度快,缺点:长度有限(有时候这也不能算是个缺点)
public class Stack {
private int top = -1;
private Object[] objs;
public Stack(int capacity) throws Exception{
if(capacity < 0)
throw new Exception("Illegal capacity:"+capacity);
objs = new Object[capacity];
}
public void push(Object obj) throws Exception{
if(top == objs.length - 1)
throw new Exception("Stack is full!");
objs[++top] = obj;
}
public Object pop() throws Exception{
if(top == -1)
throw new Exception("Stack is empty!");
return objs[top--];
}
public void dispaly(){
System.out.print("bottom -> top: | ");
for(int i = 0 ; i <= top ; i++){
System.out.print(objs[i]+" | ");
}
System.out.print("\n");
}
public static void main(String[] args) throws Exception{
Stack s = new Stack(2);
s.push(1);
s.push(2);
s.dispaly();
System.out.println(s.pop());
s.dispaly();
s.push(99);
s.dispaly();
s.push(99);
}
}
bottom -> top: | 1 | 2 |
2
bottom -> top: | 1 |
bottom -> top: | 1 | 99 |
Exception in thread "main" java.lang.Exception: Stack is full!
at Stack.push(Stack.java:17)
at Stack.main(Stack.java:44)
数据项入栈和出栈的时间复杂度都为常数O(1)
栈数组实现二:优点:无长度限制,缺点:入栈慢
import java.util.Arrays;
public class UnboundedStack {
private int top = -1;
private Object[] objs;
public UnboundedStack() throws Exception{
this(10);
}
public UnboundedStack(int capacity) throws Exception{
if(capacity < 0)
throw new Exception("Illegal capacity:"+capacity);
objs = new Object[capacity];
}
public void push(Object obj){
if(top == objs.length - 1){
this.enlarge();
}
objs[++top] = obj;
}
public Object pop() throws Exception{
if(top == -1)
throw new Exception("Stack is empty!");
return objs[top--];
}
private void enlarge(){
int num = objs.length/3;
if(num == 0)
num = 1;
objs = Arrays.copyOf(objs, objs.length + num);
}
public void dispaly(){
System.out.print("bottom -> top: | ");
for(int i = 0 ; i <= top ; i++){
System.out.print(objs[i]+" | ");
}
System.out.print("\n");
}
public static void main(String[] args) throws Exception{
UnboundedStack us = new UnboundedStack(2);
us.push(1);
us.push(2);
us.dispaly();
System.out.println(us.pop());
us.dispaly();
us.push(99);
us.dispaly();
us.push(99);
us.dispaly();
}
}
bottom -> top: | 1 | 2 |
2
bottom -> top: | 1 |
bottom -> top: | 1 | 99 |
bottom -> top: | 1 | 99 | 99 |
由于该栈是由数组实现的,数组的长度是固定的,当栈空间不足时,必须将原数组数据复制到一个更长的数组中,考虑到入栈时或许需要进行数组复制,平均需要复制N/2个数据项,故入栈的时间复杂度为O(N),出栈的时间复杂度依然为O(1)
栈单链表实现:没有长度限制,并且出栈和入栈速度都很快
public class LinkedList {
private class Data{
private Object obj;
private Data next = null;
Data(Object obj){
this.obj = obj;
}
}
private Data first = null;
public void insertFirst(Object obj){
Data data = new Data(obj);
data.next = first;
first = data;
}
public Object deleteFirst() throws Exception{
if(first == null)
throw new Exception("empty!");
Data temp = first;
first = first.next;
return temp.obj;
}
public void display(){
if(first == null)
System.out.println("empty");
System.out.print("top -> bottom : | ");
Data cur = first;
while(cur != null){
System.out.print(cur.obj.toString() + " | ");
cur = cur.next;
}
System.out.print("\n");
}
}
public class LinkedListStack {
private LinkedList ll = new LinkedList();
public void push(Object obj){
ll.insertFirst(obj);
}
public Object pop() throws Exception{
return ll.deleteFirst();
}
public void display(){
ll.display();
}
public static void main(String[] args) throws Exception{
LinkedListStack lls = new LinkedListStack();
lls.push(1);
lls.push(2);
lls.push(3);
lls.display();
System.out.println(lls.pop());
lls.display();
}
}
top -> bottom : | 3 | 2 | 1 |
3
top -> bottom : | 2 | 1 |
数据项入栈和出栈的时间复杂度都为常数O(1)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196768.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...