我以为我会发布一些我的家庭作业。我迷失了。我必须非常有效率。不使用任何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'单位向右移动数组一样......我似乎只能在一个已满的数组中这样做。有人可以帮助我吗?
答案 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;
}