尚硅谷Java数据结构学习记录2——用数组模拟单链表

    No enclosing instance of type ArrayQueueDemo is accessible. Must qualify the allocation with an enclosing instance of type ArrayQueueDemo (e.g. x.new A() where x is an instance of ArrayQueueDemo).

在学习过程中 ArrayQueue arrayqueue = new ArrayQueue(3);报错

查资料的时候发现是因为类ArrayQueue没有被static修饰。关于static的用法,它可以修饰静态方法,静态内部类等。主函数main()是一个静态方法,因此为了使用它,类也需要用static修饰。

ps:

关于输出队列的数据,应该是front+1 到rear+1之间的数据

画图可以知道,最重要的是: 只有添加数据rear才会++,只有删除数据,front才会++

package datacode;

import java.util.Scanner;

/*
 * 使用数组模拟队列,需注意
 * 1.必须使用static修饰ArrayQueue类,因为main方法是被static修饰的,否则会报错
 * 2.h和g的操作需要使用try catch,否则会报错
 * 3.显示队列数据的时候,长度应该是front+1 到rear+1之间 因为初始都为1,rear是添加数据的时候增加1,front是删除数据的时候加1
 * 这样操作更加严谨
 */
public class ArrayQueueDemo {
	//构建ArrayQueue类
	
	//注意要用static修饰类ArrayQueue
	static class ArrayQueue{
		private int MaxSize; //表示数组的最大容器
		private int front; //队列头
		private int rear;//队列尾
		private int[] arr; //用于存放数据,模拟队列
		

		
		//判断队列是否满
		public boolean isFull() {
			return rear == MaxSize - 1;
		}
		
		//判断队列是否为空
		public boolean isEmpty() {
			return rear == front;
		}
		
		//添加数据到队列
		public void addQueue(int n ) {
			if(isFull()) {
				System.out.print("队列满,无法添加数据");
				return;
			}
			rear++;
			arr[rear] = n;
		}
		
		//获取队列的数据出队列
		public int getQueue() {
			//判断队列为空
			if(isEmpty()) {
				throw new RuntimeException("队列空,无法读取数据");
			}
			front++;
			return arr[front];
		}
		
		//显示队列中的所有数据
		public void showQueue() {
			if(isEmpty()) {
				System.out.print("队列为空,无数据");
				return; 
			}
			//这里不应该是arr的长度,而应该是rear+1
			for(int i = front+1; i<rear + 1;i++) {
				System.out.printf("arr[%d]=%d\n",i,arr[i]);
			}
		}
		
		//显示队列的头数据,不是取出数据
		public int headQueue() {
			if(isEmpty()) {
				throw new RuntimeException("队列空");
			}
			return arr[front + 1];
		}
		
		//创建队列的构造器
		public ArrayQueue(int arrMaxSize) {
			this.MaxSize = arrMaxSize; 
			front = -1;
			rear = -1;
			arr = new int[MaxSize];

		}
	}
	
	


	public static void main(String[] args) {
		// TODO Auto-generated method stub
        ArrayQueue queue = new  ArrayQueue(3); //= new ArrayQueue(3);

		char key = ' ';//接收用户输入
		Scanner scanner = new Scanner(System.in);
		boolean loop = true;
		//弹出一个菜单
		while(loop) {
			System.out.println("s(show):显示队列");
			System.out.println("e(exit):退出程序");
			System.out.println("a(add):添加数据到队列");
			System.out.println("g(get):从队列取出数据");
			System.out.println("h(head):查看队列头的数据");
			key = scanner.next().charAt(0);
			switch(key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("输出一个数");
				int value = scanner.nextInt();
				queue.addQueue(value);
				break;
			case 'g':
				//g和h需要写try catch 否则报错
				try {
					int res = queue.getQueue();
					System.out.printf("取出的数据是%d\n", res);
				}catch(Exception e) {
					System.out.print(e+ "\n");
				}
				
				break;
			case 'h':
				try {
					int res1 = queue.headQueue();
					System.out.printf("队列头的数据是%d\n", res1);
				}catch(Exception e) {
					System.out.print(e+ "\n");
				}

				break;
			case 'e':
				scanner.close();
				loop = false;
				break;
			default:
				break;

			}
		}
		
	}




}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值