用于数组C ++的PushFront方法

时间:2009-11-03 05:42:52

标签: c++

我以为我会发布一些我的家庭作业。我迷失了。我必须非常有效率。不使用任何stls,boost等。通过这篇文章,我希望有人能帮助我解决这个问题。

bool stack::pushFront(const int nPushFront)
{     
     if ( count == maxSize ) // indicates a full array
     {
        return false;
     }
     else if ( count <= 0 )
     {
         count++;
         items[top+1].n = nPushFront;
         return true;
     }
     ++count;
     for ( int i = 0; i < count - 1; i++ )
     {
         intBackPtr = intFrontPtr;
         intBackPtr++;
        *intBackPtr = *intFrontPtr;
     }
     items[top+1].n = nPushFront;
     return true;    
}

我无法弄清楚我的生活是否正确地做到了这一点!我希望我能做到这一点,用指针和所有

做什么
int *intFrontPtr = &items[0].n;
int *intBackPtr  = &items[capacity-1].n;

我试着想一下这个pushFront方法,就像用'n'单位向右移动数组一样......我似乎只能在一个已满的数组中这样做。有人可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

首先,我不确定你为什么要使用else if ( count <= 0 )行 - 堆栈中的项目数量永远不应低于0。

通常情况下,你不是通过推到前面来实现堆叠,而是从后面推动和弹出。所以,不要将所有内容都移动,就像你正在做的那样,只需存储指向 last 元素所在位置的指针,然后插入,然后从那里弹出。当你按下时,只需递增该指针,当你弹出时,递减它(你甚至不必删除它)。如果该指针位于数组的末尾,则表示您已满(因此您甚至不必存储计数值)。如果它在开始时,它就是空的。

修改

如果您正在排队,请查看Circular Queues。这通常是你如何在一个数组中实现一个。或者,不要使用数组,而是尝试使用Linked List - 这可以让它任意大(唯一的限制就是计算机的内存)。

答案 1 :(得分:3)

您不需要任何指针来移动数组。只需使用简单的声明:

int *a; // Your array
int count; // Elements count in array
int length; // Length of array (maxSize)

bool pushFront(const int nPushFront)
{
    if (count == length) return false;
    for (int i = count - 1; i >= 0; --i)
        Swap(a[i], a[i + 1]);
    a[0] = nPushFront; ++count;
    return true;
}

答案 2 :(得分:1)

没有为你做功课,让我看看能不能给你一些提示。如果你可以理解一些概念,那么实现一个双端队列(双端队列)真的很容易。

首先,需要注意的是,由于我们将弹出正面和/或背面以便有效地编码使用连续存储的算法,我们需要能够在不移动整个阵列的情况下弹出前/后(你目前在做什么)。更简单,更简单的方法是在你的双端队列中跟踪相关数据的正面和背面。

作为上述概念的一个简单例子,考虑一个大小为10的静态(不能增长)的双端队列:

class Deque
{
public:
    Deque() 
    : front(0)
    , count(0) {}

private:
    size_t front;
    size_t count;
    enum {
        MAXSIZE = 10
    };
    int data[MAXSIZE];
};

你当然可以实现这一点,并允许它在大小等方面增长。但为了简单起见,我将这一切都抛弃了。现在允许用户添加到双端队列:

void Deque::push_back(int value)
{
    if(count>=MAXSIZE)
        throw std::runtime_error("Deque full!");
    data[(front+count)%MAXSIZE] = value;
    count++;
}  

然后弹出背面:

int Deque::pop_back()
{
    if(count==0)
        throw std::runtime_error("Deque empty! Cannot pop!");
    int value = data[(front+(--count))%MAXSIZE];
    return value;
}

现在,在上述函数中要注意的关键是我们如何访问数组中的数据。通过使用MAXSIZE进行修改,我们确保不会访问越界,并且我们正在达到正确的值。此外,当前面的值发生变化时(由于push_front,pop_front),模数运算符确保适当地处理环绕。我将告诉你如何做push_front,你可以自己弄清楚pop_front:

void Deque::push_front(int value)
{
    if(count>=MAXSIZE)
        throw std::runtime_error("Deque full!");
    // Determine where front should now be.
    if (front==0)
       front = MAXSIZE-1;
    else
       --front;
    data[front] = value;
    ++count;
}