我目前正在尝试编写一个实现 quack (队列/堆栈)的程序。在每个quack实例中,我都有一个指向字符数组'items'的指针。我已经编写了pushBack
和pushFront
函数,但我去编写了popFront
和popBack
函数,并意识到我不知道如何取消引用元素从这个实例中的数组。
我的老师向我提供了一个文本文件,说明该程序的输出应该是什么样的,并且它需要看起来与他的完全相同。在他的输出文件中,当字符从数组的前面或后面弹出时,它仍然保留在内存中的那个位置,它不再被数组使用。因此,当我从阵列的正面或背面弹出索引位置时,我不能只将索引位置设置回原来初始化的位置。这个角色需要留在那里,所以当我运行代码时,它仍然会显示出来,即使它已经弹出数组,直到某些东西被推到数组上覆盖它(数组的容量是静态的)。
注意:我的程序正在创建并写入一个单独的文本文件,该文件显示从数组当前前端到后面的数组元素,而不是来自 items [0] < / em>到 items [capacity-1] ,一旦弹出数组,该文件就不会打印该字符。
我有一个名为 front 的int变量,它包含数组的当前前索引位置,以及一个名为 back 的int变量,其后面的索引位置为数组。在尝试编写popFront
函数时,我尝试了类似
delete[] &items[front];
并且没有用,也没有用
delete[front] items;
让您知道我正在尝试做什么。我不知道我需要使用什么语法来完成这项工作。我会在这里为您提供更多代码,以便您自己查看:
Quack 构造函数:(是的,我必须将数组中的元素初始化为' - ',因为
这就是他们在尚未在输出文件中分配字母时需要查看的内容)。此外,为growBy
提供了扩展阵列的实现,如果我想做一个更难的版本的这个赋值并使数组动态,但我没有时间做那个,所以你可以忽略growBy
。
Quack::Quack(int capacity, int growBy) :
capacity(capacity),
growBy(growBy),
nItems(0),
items(new char[capacity]),
front(NULL),
back(NULL)
{
for (int i = 0; i < capacity; i++)
{
items[i] = '-';
}
}
这是我的 Quack 类:(我在Quack类中省略了printArray
函数,因为它很长且无关紧要)
class Quack
{
public:
Quack(int capacity, int growBy = 0);
// capacity: # of slots in array
// growBy: # of slots to add to array when it grows, 0 means "don't grow"
~Quack(void);
bool pushFront(const char ch); // push an item onto the front
bool pushBack(const char ch); // push an item onto the back
bool popFront(char& ch); // pop an item off the front
bool popBack(char& ch); // pop an item off the back
void rotate(int r); // "rotate" the stored items (see note below)
void reverse(void); // reverse the order of the stored items
int itemCount(void); // return the current number of stored items
private:
char *items; // pointer to storage for circular array,
// each item in the array is a char
// items is an array with
int nItems; // # of items currently stored in array
int capacity;
int growBy; // # of slots in array
int front;
int back;
public:
friend std::ostream& operator<<(std::ostream& out, Quack *q);
};
最后,这是我正在使用popFront
做的事情(你可以看到元素解除引用需要去的地方;其余的就是我弹出项目后正在改变前面的地方) 。 itemCount()
是一个除了返回 nItems 之外什么都不做的函数,这是列表中的项目数,我也在跟踪它。
bool Quack::popFront(char& ch)
{
// if list is empty, can't pop
if (itemCount() == 0)
{
return false;
}
// pop front item
/* here is where I don't know what to do, stackoverflow */
// increment front and nItems
if (front < (capacity - 2))
{
front++;
nItems--;
return false;
}
else if (front == (capacity - 1))
{
front = 0;
nItems--;
return false;
}
return false;
}
这是VS中程序的正确输出,因此您可以看到它应该做什么:
(popFront弹出列表前面的项目,popBack弹出列表后面的项目, pushFront将项添加到列表的前面,pushBack将项添加到列表的后面)
pushFront(a) [ a - - - - - - ]
pushFront(b) [ a - - - - - b ]
pushFront(c) [ a - - - - c b ]
pushFront(d) [ a - - - d c b ]
pushBack(z) [ a z - - d c b ]
pushFront(e) [ a z - e d c b ]
popFront -> e [ a z - e d c b ]
popFront -> d [ a z - e d c b ]
pushBack(f) [ a z f e d c b ]
pushBack(g) [ a z f g d c b ]
rotate(2) [ a z f g c b b ]
rotate(-3) [ a z f g g c b ]
reverse [ b c g g f z a ]
pushFront(y) [ b c g y f z a ]
rotate(3) [ b c g y f z a ]
rotate(-4) [ b c g y f z a ]
popBack -> c [ b c g y f z a ]
popBack -> b [ b c g y f z a ]
popBack -> a [ b c g y f z a ]
popBack -> z [ b c g y f z a ]
popBack -> f [ b c g y f z a ]
popBack -> y [ b c g y f z a ]
popBack -> g [ b c g y f z a ]
还有一点需要注意:我没有抛出任何异常的原因是因为我没有在此包含任何队列实现。我拥有的唯一的库是fstream,iostream,ostream和iomanip(据我所知,根据作业的要求,我不能包括任何其他库)。
没有像quack或quackException这样的保留术语,看起来如此,所以在我抛出queueException的情况下,我只返回false(我假设这就是为什么函数是bool类型的原因,我无法想到任何其他原因:我们提供了函数原型,没有任何函数定义)。
非常感谢你的时间,哦,明智的!
答案 0 :(得分:0)
您的变量items
是一个数组。你可以delete
整个数组:
delete [] items;
或者不是delete
任何一个,你不能逐段删除一个元素。
答案 1 :(得分:-1)
ch
由引用&
传递,这意味着如果为其赋值,则将该值分配给传递给函数的变量。如果没有&
,则作为参数传递的值将被复制到ch
中,如果您更改了ch
,则原始参数不会产生任何影响。
分配给引用类似于分配给普通变量。引用指向与内存中另一个变量相同的数据,但它不是指针。引用只能“指向”另一个变量一次,但指针可以多次指向。
以下是一个例子:
// A silly example, which doubles the variable passed in
void doubleValue( int& i ) {
i = i * 2;
}
// Sample use:
int j = 2;
doubleValue( j ); // j is now 4
doubleValue( j ); // j is now 8
因此,如果您需要返回ch
中的弹出值,您可以使用数组访问,就像通常从数组中获取值一样。
char sample = items[front];