알고리즘 서론 10.1 - 5 쌍 단 대기 열
스 택 의 삽입 과 삭제 작업 은 모두 한 끝 에서 진행 되 며, 대기 열의 삽입 과 삭 제 는 양쪽 에서 진행 된다.다른 양 끝 대기 열 (deque) 은 양쪽 모두 삽입 과 삭제 작업 을 할 수 있 습 니 다.배열 로 구 성 된 양 끝 대기 열 에 대해 서 는 양 끝 에 삽입 하고 삭제 하 는 네 개의 작업 과정 을 작성 하 십시오. 실행 시간 이 모두 O (1) 여야 합 니 다.
위조 코드
NEXT(p, l)
1 if p = l
2 then ret <- 1
3 else ret <- p + 1
4 return ret
PRE(p, l)
1 if p = 1
2 then ret <- l
3 else ret <- p - 1
4 return ret
DEQUEUE-LEFT-INSERT(D, x)
1 l <- PRE([left[D], length[D])
2 if l = right[D]
3 then error "overflow"
4 if left[D] = right[D]
5 right[D] <- NEXT(right[D], length[D])
6 D[left[D]] <- x
7 left[D] <- l
DEQUEUE-RIGHT-INSERT(D, x)
1 r <- NEXT([right[D], length[D])
2 if r = left[D]
3 then error "overflow"
4 if left[D] = right[D]
5 left[D] <- PRE(left[D], length[D])
6 D[right[D]] <- x
7 right[D] <- r
DEQUEUE-LEFT-DELETE(D)
1 if left[D] = right[D]
2 then error "underflow"
3 ret <- D[left[D]]
4 left[D] <- NEXT(left[D], length[D])
DEQUEUE-RIGHT-DELETE(D)
1 if left[D] = right[D]
2 then error "underflow"
3 ret <- D[right]
4 right[D] <- PRE(right[D], length[D])
코드
//
struct deque
{
//
int left;// , 1
int right;// , 1
int length;//
int *s;//
deque(int size):left(1),right(1),length(size){s = new int[size+1];}
};
//
void Print(deque D)
{
int i;
if(D.right >= D.left)
{
for(i = D.left+1; i < D.right; i++)
cout<<D.s[i]<<' ';
cout<<endl;
}
//
else
{
for(i = D.left + 1; i <= D.length; i++)
cout<<D.s[i]<<' ';
for(i = 1; i < D.right; i++)
cout<<D.s[i]<<' ';
cout<<endl;
}
}
//
bool Deque_Empty(deque D)
{
if(D.left == D.right)
return 1;
return 0;
}
// , ,
int Next(int p, int l)
{
if(p == l)
return 1;
else return p+1;
}
int Pre(int p, int l)
{
if(p == 1)
return l;
else
return p - 1;
}
//
void Deque_Left_Insert(deque &D, int x)
{
//
int l = Pre(D.left, D.length);
if(l == D.right)
{
cout<<"error:overflow"<<endl;
return ;
}
// ,
if(D.left == D.right)
D.right = Next(D.right, D.length);
D.s[D.left] = x;
D.left = l;
}
// ,
void Deque_Right_Insert(deque &D, int x)
{
int r = Next(D.right, D.length);
if(r == D.left)
{
cout<<"error:overflow"<<endl;
return ;
}
if(D.left == D.right)
D.left = Pre(D.left, D.length);
D.s[D.right] = x;
D.right = r;
}
//
int Deque_Left_Delete(deque &D)
{
//
if(D.left == D.right)
{
cout<<"error:underflow"<<endl;
return -1;
}
D.left = Next(D.left, D.length);
// ,
if(Next(D.left,D.length) == D.right)
D.right = D.left;
return D.s[D.left];
}
// ,
int Deque_Right_Delete(deque &D)
{
if(D.left == D.right)
{
cout<<"error:underflow"<<endl;
return -1;
}
D.right = Pre(D.right, D.length);
if(Next(D.left,D.length) == D.right)
D.left = D.right;
return D.s[D.right];
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.