JAVA

Stack, Queue

inderrom 2022. 10. 26. 01:25
package kr.or.ddit.basic;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class StackQueueTest {
/*
 * - Stack ==> 후입선출(LIFO) 의 자료구조 (last in first out) 마지막에 들어간게 먼저 나온다.
 * 
 * - Queue ==> 선입선출(FIFO) 의 자료구조 (first in first out) 처음 들어간게 먼저 나온다.
 * 
 * - Stack과 Queue는 LinkedList를 이용하여 사용할 수 있다.
 * - 메서드를 호출할때마다 정보가 담기고 삭제하면 그전작업으로 돌아가는 거 -> 콜스택
 * 
 * */
	public static void main(String[] args) {
	/*
	 * - Stack의 명령
	 * 1. 자료 입력: push(입력값)
	 * 2. 자료 출력 : pop() ==> 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.
	 * 			      peek() ==> 삭제없이 자료를 꺼내온다.
	 * */
		
		// 객체 생성
		
		// 방법 1
		Stack<String> stack = new Stack<String>(); // Stack클래스 이용

		// 방법2
		LinkedList<String> stack2 = new LinkedList<String>(); // LinkedList클래스 이용
		// 리스트로 생성 했다면, 위에 명령만 사용

		stack.push("홍길동");
		stack.push("일지매");
		stack.push("변학도");
		stack.push("강감찬");

		System.out.println("현재 stack값 : " + stack);

		String data = stack.pop();
		System.out.println("꺼내온 값 : " + data);
		System.out.println("꺼내온 값 : " + stack.pop());
		System.out.println("현재 stack값 : " + stack);

		stack.push("성춘향");
		System.out.println("추가 후 stack값 : " + stack);
		System.out.println("꺼내온 값 : " + stack.pop());

		System.out.println();
		System.out.println("삭제없이 꺼내온 값 : " + stack.peek());
		System.out.println("현재 stack값 :" + stack);

		System.out.println("---------------------------------------");

		/*
		 * - Queue의 명령 1. 자료 입력 : offer(입력값) 2. 자료 입력 : poll() ==> 자료를 꺼내오고 꺼내온 자료를
		 * Queue에서 삭제한다. : peek() ==>
		 */

		Queue<String> queue = new LinkedList<String>();

		queue.offer("홍길동");
		queue.offer("일지매");
		queue.offer("변학도");
		queue.offer("강감찬");
		System.out.println("현재 queue값 :" + queue);

		String temp = queue.poll();
		System.out.println("꺼내온 값 : " + temp);
		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		queue.offer("성춘향");
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		System.out.println("삭제없이 꺼내온 값 : " + queue.peek());
		System.out.println("현재 queue값 :" + queue);
	
	}
}
package kr.or.ddit.basic;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class StackQueueTest {
/*
 * - Stack ==> 후입선출(LIFO) 의 자료구조 (last in first out) 마지막에 들어간게 먼저 나온다.
 * 
 * - Queue ==> 선입선출(FIFO) 의 자료구조 (first in first out) 처음 들어간게 먼저 나온다.
 * 
 * - Stack과 Queue는 LinkedList를 이용하여 사용할 수 있다.
 * - 메서드를 호출할때마다 정보가 담기고 삭제하면 그전작업으로 돌아가는 거 -> 콜스택
 * 
 * */
	public static void main(String[] args) {
	/*
	 * - Stack의 명령
	 * 1. 자료 입력: push(입력값)
	 * 2. 자료 출력 : pop() ==> 자료를 꺼내온 후 꺼내온 자료를 Stack에서 삭제한다.
	 * 			      peek() ==> 삭제없이 자료를 꺼내온다.
	 * */
		
		// 객체 생성
		
		// 방법 1
		Stack<String> stack = new Stack<String>(); // Stack클래스 이용

		// 방법2
		LinkedList<String> stack2 = new LinkedList<String>(); // LinkedList클래스 이용
		// 리스트로 생성 했다면, 위에 명령만 사용

		stack.push("홍길동");
		stack.push("일지매");
		stack.push("변학도");
		stack.push("강감찬");

		System.out.println("현재 stack값 : " + stack);

		String data = stack.pop();
		System.out.println("꺼내온 값 : " + data);
		System.out.println("꺼내온 값 : " + stack.pop());
		System.out.println("현재 stack값 : " + stack);

		stack.push("성춘향");
		System.out.println("추가 후 stack값 : " + stack);
		System.out.println("꺼내온 값 : " + stack.pop());

		System.out.println();
		System.out.println("삭제없이 꺼내온 값 : " + stack.peek());
		System.out.println("현재 stack값 :" + stack);

		System.out.println("---------------------------------------");

		/*
		 * - Queue의 명령 1. 자료 입력 : offer(입력값) 2. 자료 입력 : poll() ==> 자료를 꺼내오고 꺼내온 자료를
		 * Queue에서 삭제한다. : peek() ==>
		 */

		Queue<String> queue = new LinkedList<String>();

		queue.offer("홍길동");
		queue.offer("일지매");
		queue.offer("변학도");
		queue.offer("강감찬");
		System.out.println("현재 queue값 :" + queue);

		String temp = queue.poll();
		System.out.println("꺼내온 값 : " + temp);
		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		queue.offer("성춘향");
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		System.out.println("꺼내온 값 : " + queue.poll());
		System.out.println("현재 queue값 :" + queue);
		System.out.println();

		System.out.println("삭제없이 꺼내온 값 : " + queue.peek());
		System.out.println("현재 queue값 :" + queue);

	}
}

**문제

package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
 문제) 학번, 이름, 국어점수, 영어점수, 수학점수, 총점, 등수를
	멤버로 갖는 Student클래스를 만든다.
	이 클래스의 생성자에서는 학번, 이름, 국어점수, 영어점수, 수학점수만 
	인수값으로 받아서 초기화 처리를 한다.

	이 Student객체는 List에 저장하여 관리한다.

	List에 저장된 데이터들을 학번의 오름차순으로 정렬할 수 있는 내부 정렬 기준을 구현하고,
	총점의 역순으로 정렬하는데 총점이 같으면 이름의 오름차순으로 정렬이 되는 
	외부 정렬 기준 클래스를 작성하여 정렬된 결과를 출력하시오.

	(단, 등수는 List에 전체 데이터가 추가된 후에 구하도록 한다.)
 */
public class StudentTest {

	public static void main(String[] args) {
		ArrayList<Student> list = new ArrayList<Student>();
		list.add(new Student(2022, "박승배", 37, 55, 60));
		list.add(new Student(2023, "김승배", 50, 88, 20));
		list.add(new Student(2020, "선승배", 70, 30, 99));
		list.add(new Student(2021, "구승배", 90, 10, 67));
		list.add(new Student(2029, "곽승배", 100, 77, 42));
		list.add(new Student(44443,"팔승배",98,77,44));
		
	      for(int i = 0 ;i < list.size(); i++) {
	          for(int j = 0; j < list.size(); j++) {
	             list.get(i).setGrade(list.get(j).getSum());
	          }
	       }
		
		System.out.println("정렬 전 ...");
		for(Student st : list) {
			System.out.println(st.toString());
		}
		System.out.println("---------------------------------------------");
		
		//오름차순
		
		Collections.sort(list);
		System.out.println("총점의 오름차순으로 정렬하기");
		for(int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		System.out.println("---------------------------------------------");
		
		  Collections.sort(list, new sumStudent());
	      
	      System.out.println("총점의 역순으로 정렬하기");
	      for(int i = 0 ; i < list.size(); i++) {
	         System.out.println(list.get(i));
	      }
	      System.out.println();
	      
	   }
	}

class sumStudent implements Comparator<Student>{

	@Override
	public int compare(Student s1, Student s2) {
		if(s1.getSum() == s2.getSum()) {
			return s1.getName().compareTo(s2.getName());
		}else {
			return s1.getSum()-s2.getSum();
		}
	}
}

class Student implements Comparable <Student>{
	private int num;
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int sum ;
	private int grade =1;
	
	
	public Student(int num, String name, int kor, int eng, int math) {
		super();
		this.num = num;
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
		this.sum = kor+eng+math;
	}
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int sum) {
	 if(sum > this.sum) this.grade ++;
	}

	@Override
	public String toString() {
		return "[학번 : " + num + ", 이름 : " + name + ", 국어점수 : " + kor + ", 영어점수 : " + eng + ", 수학점수 : " + math + ", 총합 : "
				+ sum + ", 석차 : " + grade + "]";
	}

	@Override
	public int compareTo(Student snum) {
		return this.getNum()-snum.getNum(); //오름차순이라 - 를 해준다
	}
}