Я написал функцию для замены первых и последних элементов очереди в C++
void swap(queue Q)
{
queue temp;
createQ (temp);
int x,first,last;
first=dequeue(Q);
while(!isemptyQ(Q))
{
x=dequeue(Q);
last=x;
enqueue(x,temp);
}
enqueue(last,Q);
while(!isemptyQ(temp))
{
x=dequeue(temp);
if(x!=last) enqueue(x,Q); //(if) to avoid adding last element again
}
enqueue(first,Q)
}
примечание: "просто рассмотреть (isempty, dequeue, createQ и enqueue) - это другие функции >> (мой первый год)"
но если последний элемент был дублирован в середине так, как если бы это были элементы очереди (5,1,9,3,9), если мы проследим эту функцию на этих элементах, это будет (9,1,3,5 ) там 9 пропавших !!
так что если есть выход из этой или любой другой идеи для функции?!
Нет необходимости проверять последний, если вы его не нажимаете. Я бы предпочел сделать что-то вроде:
while(!isemptyQ(Q))
{
x=dequeue(Q);
if (isemptyQ(Q))
{
last=x;
}
else
{
enqueue(x,temp);
}
}
enqueue(last,Q);
while(!isemptyQ(temp))
{
x=dequeue(temp);
enqueue(x,Q);
}
Кстати, ваш код не будет работать для пустых или 1 очереди элементов.
Ниже приведен псевдокод, который пытается охватить все особые случаи, включая 1 или нулевые элементы в очереди
swap_first_last(q) {
dequeue(q, x, isEmpty);
initialize(tmp);
first = x;
count = 0;
while(!isEmpty) {
count ++;
last = x;
dequeue(q, x, isEmpty);
if(!isEmpty) {
enqueue(tmp, last);
}
}
if(count == 0) return;
enqueue(q, last);
if(count >= 2) {
dequeue(tmp, x, isEmpty);
while(!isEmpty) {
dequeue(tmp, x, isEmpty);
if(!isEmpty) {
enqueue(q, x);
}
}
enqueue(q, first);
}
}
std::deque
и, возможно,std::swap
.