数据结构与算法:栈和队列

一,栈

栈是限定仅在表尾进行插入和删除操作线性表。允许插入,删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。

栈的基本操作
1.初始化:构造一个空的栈
2.销毁:销毁一个已存在的栈
3.插入:在栈顶位置插入一个新元素
4.删除:删除栈顶元素
5.获取:取栈顶数据元素
6.判空:判断当前栈是否为空
7.求长度:求出栈中数据元素的个数
8.正序遍历:依次访问栈中每个元素并输出

1.顺序栈;

1.栈的初始化;

//无参构造方法
public sequenceStack( ) 
{
    top=-1;
    stackArray=(T[])new Object[MaxSize];
}
//有参构造方法
public sequenceStack(int n)
{
    if (n<=0) {
    	System .out.println(“数组...程序运行!");
        	System.exit(1);
    }
    top=-1;
    stackArray=(T[])new Object[n];
}

2.入栈;

public void push(T obj)
{
    if(top==stackArray.length-1){
    	T []p=(T[])new Object [top*2];
        	for(int i=0;i<=top;i++)
            		p[i]=stackArray[i];
        	stackArray=p;
    }
    top++;
    stackArray[top]=obj;
 }

3.出栈;

public T pop()
{
    if(top==-1){
    	System.out.println(“空栈,无法删除元素");
    	return null;
    }
    top--;
    return stackArray[top+1];
 }

4.取栈顶元素;

public T getHead()
{
    if(top==-1){
    	System.out.println("空栈,无法删除元素");
    	return null;
    }
    return stackArray[top];
  }

5.判断栈空操作;

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

6.求栈的长度;

public int size()
{
    return top+1;
 }

7.遍历栈;

public void nextOrder()
{ 
    for(int i=top;i>=0;i--)
    	System.out.println(stackArray[i]);
}

8.清空栈操作;

public void clear()
{
    top=-1;
}

2.链栈
栈的链接存储结构称为链栈。

在这里插入图片描述
插入与删除仅在栈顶处执行;链式栈的栈顶在链头。链栈的基本操作如下所示:
在这里插入图片描述
1.入栈;

public void push(T obj)    //入栈
	{
		top=new Node<T>(obj,top);	
		length++;
	}

2.出栈;

 public T pop()     //出栈
{
	if(top==null){
		System.out.println(“空栈,无法删");
		return null;
	}
	T x=top.data;
	top=top.next;
	length--;
	return x;
}		

3.取栈顶元素;

public T getHead()   //取栈顶数据元素
{
	if(top==null){
		System.out.println(“栈空...!");
		return null;
	}
	return top.data;
}

4.求元素个数,判空,销毁;

public int size()    //求出栈中数据元素的个数
{
	return length;
}
public boolean isEmpty( )   //判断当前栈是否为空
  { 	
  return top==null;	
  }
   public void clear()     //销毁一个已存在的栈
  {	
  top=null;	
  }

二.队列

队列是一种运算受限制的线性表,元素的添加在表的一端进行,而元素的删除在表的另一端进行。允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
(先进先出原则)

队列的基本操作
1.初始化:构造一个空的队列
2.销毁:销毁一个已存在的队列
3.插入:在队列尾位置插入一个新元素
4.删除:删除队列头元素
5.获取:取队列头元素
6.判空:判断当前队列是否为空
7.求长度:求出队列中数据元素的个数
8.正序遍历:依次访问队列中每个元素并输出

1.顺序队列+循环队列
将顺序队列的存储区假想为是一个头尾相连的圆环,通常把这种特殊结构的队列称为循环队列。

基本操作:
1.队列初始化;

public sequenceQueue()
{
	front=rear=0;
	queueArray=(T[])new Object[MaxSize];
 }

2.入队;

public void EnQueue(T obj)
{
        if((rear+1)%queueArray.length==front){
	    T[] p=(T[])new  Object[queueArray.length*2];
	   if(rear==((T[])queueArray).length-1)
{
         for(int i=1;i<=rear;i++)
	    p[i]=queueArray[i];	    		
}
else{
	int i,j=1;	    		  		for(i=front+1;i<queueArray.length;i++,j++)
	    	p[j]=queueArray[i];
	for(i=0;i<=rear;i++,j++)
	    	p[j]=queueArray[i];
	front=0;
	rear=queueArray.length-1;
}
               queueArray=p;
         }			
        rear=(rear+1)%queueArray.length;
        queueArray[rear]=obj;
}

3.出队;

public T DeQueue()
{
	if(isEmpty()){
	  	System.out.println(“空队");
	  	return null;
	 }
	 front=(front+1)%queueArray.length;
	 return queueArray[front];
 }

4.取头元素操作;

public T getHead( )
{
       if(isEmpty()){
  	System.out.println(“空队");
  	return null;
        }
       return queueArray[(front+1)%queueArray.length];
 }

5.非空判断;

public boolean isEmpty( )
{     
        return front==rear;
}

6.求长度;

public int size()
{
        return (rear-front+queueArray.length)%queueArray.length;
}

7.遍历队列;

public void nextOrder()
{
	 int i,j=front;
	 for(i=1;i<=size();i++)
	 {
		 j=(j+1)%queueArray.length;
		 System.out.println(queueArray[j]);  
	 }
 }

8.清空队列;

public void clear()
{  	front=rear=0;     }

2.链队列;
用链表表示的队列称为链队列。

1.初始化链队列;

public linkQueue()
{
	length=0;
	front=rear=new Node<T>(null);  
}

2.入队;

public void EnQueue(T obj)
{
	rear=rear.next=new Node<T>(obj,null);
	length++;
}

3.出队;

public T DeQueue()
{
	if(isEmpty( )){
		System.out.println(“空队");
		return null;
	}
	Node<T> p=front.next;
	T x=p.data;
	front.next=p.next;
	length--;
	if(front.next==null)
		rear=front;
	return x;
 }

4.取队头元素;

public T getHead()
 {
  	if(isEmpty( )){
  		System.out.println(“空队");
  		return null;
  	}
  	return front.next.data;
 }

5.求队列的长度;

public int size()
{
	return length;
}

6.判断队列是否为空;

public boolean isEmpty( )
{  	
	return front.next==null;     
 }

7.输出元素;

public void nextOrder()  
{
	 Node<T> p=front.next;
	 while(p!=null){
		 System.out.println(p.data);
		 p=p.next;
	 }	
 }

8.清空队列;

public void clear()
{
  	front.next=rear.next=null;
 }

三.小结

1、栈是限定仅在表尾进行插入和删除操作的线性表。允许插入,删除的一端称为栈顶(top),另一端称为栈底(bottom)。
2、栈的特征是后进先出。
3、队列是一种运算受限制的线性表,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。
4、队列的特征是先进先出。
5、顺序存储结构的队列存在假溢出现象,故引入了循环队列。
6、循环队列的判空条件为front==,判满条件为:(rear+1)% queueArray.length == front 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值