数据结构之栈和队列实现

栈接口的定义

public interface Stack
{
	void push(Object obj);
	Object pop();
	Object peek();
	boolean isEmpty();
	void clear();
}

栈的顺序存储结构操作实现

public class SequenceStack implements Stack
{
	final int minSize=10;
	private Object[] stackArray;
	private int top;

	public SequenceStack()
	{
		top=-1;
		stackArray=new Object[minSize];
	}
	public SequenceStack(int n)
	{
		if(n<minSize) n=minSize;
		top=-1;
		stackArray=new Object[n];
	}
	public void push(Object obj)
	{
		if(top==stackArray.length-1){
			Object[] p=new Object[top*2];
			for(int i=0;i<=top;i++) p[i]=stackArray[i];
			stackArray=p;
		}
		top++;
		stackArray[top]=obj;
	}
	public Object pop()
	{
		if(top==-1) return null;
		top--;
		return stackArray[top+1];
	}
	public Object peek()
	{
		if(top==-1) return null;
		return stackArray[top];
	}
	public boolean isEmpty()
	{
		return top==-1;
	}
	public void clear()
	{
		top=-1;
	}
}

客户端实现代码

public class Example
{
	public static void main(String[] args)
	{
		Stack sck=new SequenceStack();
		int []a={3,8,5,17,9,30,15,22};
		for(int i=0;i<a.length;i++) sck.push(a[i]);
		System.out.println(sck.pop()+","+sck.pop()+","+sck.pop());
		sck.push(68);
		System.out.println(sck.peek()+","+sck.pop()+","+sck.pop());
		while(!sck.isEmpty()) System.out.print(sck.pop()+" ");
		System.out.println();
		sck.clear();
	}
}

栈的链接存储结构

链接栈的操作方法十分简单,具体如下:

public class LinkStack implements Stack
{
	private Node top;
	public LinkStack()
	{
		top=null;
	}
	public void push(Object obj)
	{
		top=new Node(obj,top);
	}
	public Object pop()
	{
		if(top==null) return null;
		Node p=top;
		top=top.next;
		return p.element;
	}
	public Object peek()
	{
		if(top==null) return null;
		return top.element;
	}
	public boolean isEmpty()
	{
		return top==null;
	}
	public void clear()
	{
		top=null;
	}
}

客户端实现代码只需要将上一个调试程序的SequenceStack()替换为LinkStack()就可以。

队列

public interface Queue
{
	void enter(Object obj);
	Object leave();
	Object peek();
	boolean isEmpty();
	void clear();
}

队列的顺序存储结构的实现

public class SequenceQueue implements Queue
{
	final int minSize=10;
	private Object queueArray[];
	private int front,rear;

	public SequenceQueue()
	{
		front=rear=0;
		queueArray=new Object[minSize];
	}
	public SequenceQueue(int n)
	{
		front=rear=0;
		if(n<=minSize) n=minSize;
		queueArray=new Object[n];
	}
	public void enter(Object obj)
	{
		if((rear+1)%queueArray.length==front)
		{
			Object[] p=new Object[queueArray.length*2];
			if(rear==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;
	}
	public Object leave()
	{
		if(front==rear) return null;
		front=(front+1)%queueArray.length;
		return queueArray[front];
	}
	public Object peek()
	{
		if(front==rear) return null;
		return queueArray[(front+1)%queueArray.length];
	}
	public boolean isEmpty()
	{
		return front==rear;
	}
	public void clear()
	{
		front=rear=0;
	}
}

客户端实现代码:

public void Example
{
	public static void main(String[] args)
	{
		Queue que=new SequenceQueue();
		int []a={3,8,5,17,9,30,15,22,20,13,35,26};
		int i;
		for(i=0;i<a.length;i++) que.enter(a[i]);
		System.out.print(que.leave()+" ");
		System.out.print(que.leave()+" ");
		que.enter(68);
		System.out.print(que.peek()+" ");
		System.out.print(que.leave());
		while(!que.isEmpty()) System.out.print(que.leave()+" ");
		System.out.println();
		que.clear();
	}
}

队列的链接存储结构的实现

public class LinkQueue implements Queue
{
	private Node front,rear;
	public LinkQueue()
	{
		front=rear=null;
	}
	public void enter(Object obj)
	{
		if(rear==null)
			front=rear=new Node(obj,null);
		else
			rear=rear.next=new Node(obj,null);
	}
	public Object leave()
	{
		if(front==null) return null;
		Node x=front;
		front=front.next;
		if(front==null) rear=null;
		return x.element;
	}
	public Object peek()
	{
		if(front==null) return null;
		return front.element;
	}
	public boolean isEmpty()
	{
		return front==null;
	}
	public void clear()
	{
		front=rear=null;
	}
}

客户端实现代码只需要将上一个调试程序的主函数的第一句改为Queue que=new LinkQueue();就可以了。

时间: 2024-10-07 04:42:43

数据结构之栈和队列实现的相关文章

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝

[ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)

再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个阶段再去探究具体的实现,以及对基本结构的改造! C++标准库中 这里记录一个经典的关于栈和队列的面试题目: 题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 思路:重点是getMin()函数的设计,普通思路是设计一

浅谈数据结构系列 栈和队列

计算机程序离不开算法和数据结构,在数据结构算法应用中,栈和队列应用你比较广泛,因为两者在数据存放和读取方面效率比较高,本章节重点讲解两者的基本概念和实现. 基本概念 栈:是一种先进后出,后进先出的数据结构,本质上是线性表,只是限制仅允许在表的一段进行插入和删除工作.此端为栈顶,这是在栈中应用很关键的概念.所有数据的处理都是在栈顶进行的,进栈时,栈中元素增加,栈顶上移一位,出栈时栈顶下移一位.应用中比如:洗碗,每次洗干净的碗放在上面-进栈,取碗,从顶上取出一个-出栈:装子弹-进栈,开枪-出栈. 队

数据结构入门——栈与队列

栈与队列是两种重要的数据结构,有着广泛的应用,他们可以通过对链表功能加以限制改造而来.栈是一种先进后出(FILO)的数据结构,只能在一头进行加入删除,而队列是一种先进先出(FIFO)的数据结构,一头只能加入,另一头只能删除. 栈的实现: # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node { int data; struct Node * pNext; }NO

python——python数据结构之栈、队列的实现

这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出特征的线性数据结构,元素的增加只能在一端进行,元素的删除只能在另一端进行.能够增加元素的队列一端称为队尾,可以删除元素的队列一端则称为队首. 地址在 http://docs.python.org/2/tutorial/datastructures.

数据结构之栈和队列及其Java实现

栈和队列是数据结构中非常常见又非常基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用两个栈实现队列和用两个队列实现栈. 栈:栈是一种基于"后进先出"策略的线性表.在插入时(入栈),最先插入的元素在栈尾,最后插入的元素在栈顶:在删除时(出栈),最后插入的元素先出栈,最先插入的元素最后出栈.由此可见,对栈的插入和删除操作都是在栈顶位置进行的. 在Java中,提供了一个类Stack<E>来实现栈的这些特性,并提供了一些常用的