데이터 구조 (2): 스 택 과 대기 열
데이터 구조 (1): 배열 과 링크
이론 지식
스 택 과 대기 열 은 모두 선형 데이터 구조 로 논리 구조 에 속 하 며 물리 구조 (배열 과 링크) 에서 파생 된 것 이기 때문에 스 택 과 대기 열 은 배열 로 실현 할 수도 있 고 링크 로 실현 할 수도 있 으 며 두 가지 실현 방식 은 각종 우열 이다.
1. 창고
기본 개념
코딩 실현 사고
배열 로 스 택 을 실현 합 니 다. 전체 스 택 의 작업 은 스 택 꼭대기 라 는 위치 에 있 는 요 소 를 조작 하 는 것 입 니 다. 스 택 에 들 어 갈 때 스 택 꼭대기 요 소 는 배열 의 새로운 요소 의 아래 표 로 변경 합 니 다.스 택 을 나 갈 때 스 택 상단 요 소 는 스 택 요소 의 이전 요소 의 배열 아래 표 시 됩 니 다.
배열 의 크기 가 일정 하기 때문에 경 계 를 넘 는 문제 에 주의해 야 한다.읽 을 때 비어 있 는 지, 삽입 할 때 꽉 찼 는 지 판단 합 니 다.
응용 장면
스 택 의 수출 순서 와 입력 순서 가 반대 되 기 때문에 스 택 은 보통 '역사' 에 대한 역 추적 에 사용 된다. 비교적 전형 적 인 응용 은 바로 빵 부스러기 내 비게 이 션 으로 앞의 단계 나 앞의 몇 단계 로 쉽게 거 슬러 올 라 갈 수 있다.
2. 대열
기본 개념
코딩 실현 사고
배열 로 대기 열 을 실현 합 니 다. 스 택 과 마찬가지 로 배열 에 대한 작업 으로 전 환 됩 니 다.스 택 과 달리 스 택 은 스 택 지붕 에 만 관심 을 가지 면 됩 니 다. 대열 은 '두 마리', 즉 팀 머리 와 팀 꼬리 에 관심 을 가 져 야 합 니 다. 나머지 실현 원 리 는 비슷 합 니 다.
창고 와 마찬가지 로 수조 의 크기 가 일정 하기 때문에 반드시 경 계 를 넘 는 문제 에 주의해 야 한다.읽 을 때 비어 있 는 지, 삽입 할 때 꽉 찼 는 지 판단 합 니 다.
응용 장면
파충 류 는 비교적 전형 적 인 응용 이 라 고 할 수 있다. 사 이 트 를 기어 올 라 갈 때 한 라인 으로 기어 올 라 갈 수 없고 여러 라인 으로 기어 올 라 갈 때 중복 기어 오 르 는 문 제 를 해결 해 야 한다.따라서 기어 오 를 url 을 대열 에 넣 고 대열 의 순서에 따라 순서대로 기어 올 라 갈 수 있다.
같은 이치 로 일부 다 중 스 레 드 응용 에서 다음 대기 열 을 고려 할 수 있다.
소스 코드
창고.
/**
* demo
* @author yangjunqiang
*
*/
public class MyStackDemo {
//
private int[] stackArray;
//
private int top;
//
private int size;
/**
* ,
* @param size
*/
public MyStackDemo(int size) {
this.size = size;
this.stackArray = new int[size];
// , -1
this.top = -1;
}
/**
*
* @param element
* @return
*/
public int push(int element) {
// ,
if(isFull()) {
throw new IndexOutOfBoundsException(" ");
}
// ,
top += 1;
stackArray[top] = element;
return element;
}
/**
*
* @return
*/
public int pop() {
//
if(isEmpty()) {
throw new NoSuchElementException(" , ");
}
int element = stackArray[top];
// ,
top -= 1;
return element;
}
/**
*
* ,
*/
public void clear() {
top = -1;
}
/**
* ,
* @return
*/
public int size() {
return size;
}
/**
*
* @return
*/
public boolean isEmpty() {
return (top == -1);
}
/**
*
* @return
*/
public boolean isFull() {
return (top == size - 1);
}
}
대열
/**
*
* @author yangjunqiang
*
*/
public class MyQueueDemo {
//
private int[] array;
//
private int front;
// , ,
private int rear;
/**
* ,
* @param size
*/
public MyQueueDemo(int size) {
this.array = new int[size];
}
public void enQueue(int element) throws Exception {
if(isFull()) {
throw new Exception(" ");
}
array[rear] = element;
// , , , ,
// , , ,
rear = (rear + 1) % array.length;
}
public int deQueue() throws Exception {
if(isEmpty()) {
throw new Exception(" ");
}
// ,
int deQueueElement = array[front];
//
front = (front + 1) % array.length;
return deQueueElement;
}
public void printf() {
for(int i = front; i != rear; i = (i + 1) % array.length) {
System.out.println(array[i]);
}
}
/**
* , 。
* , :( + 1) % =
* @return
*/
public boolean isFull() {
return ((rear + 1) % array.length == front);
}
/**
*
* =
*/
public boolean isEmpty() {
return (rear == front);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.