弹出包含在嘎嘎(队列/堆栈)中的圆形数组顶部的项目

时间:2014-10-26 02:36:16

标签: c++ arrays stack queue

我目前正在尝试编写一个实现 quack (队列/堆栈)的程序。在每个quack实例中,我都有一个指向字符数组'items'的指针。我已经编写了pushBackpushFront函数,但我去编写了popFrontpopBack函数,并意识到我不知道如何取消引用元素从这个实例中的数组。

我的老师向我提供了一个文本文件,说明该程序的输出应该是什么样的,并且它需要看起来与他的完全相同。在他的输出文件中,当字符从数组的前面或后面弹出时,它仍然保留在内存中的那个位置,它不再被数组使用。因此,当我从阵列的正面或背面弹出索引位置时,我不能只将索引位置设置回原来初始化的位置。这个角色需要留在那里,所以当我运行代码时,它仍然会显示出来,即使它已经弹出数组,直到某些东西被推到数组上覆盖它(数组的容量是静态的)。

注意:我的程序正在创建并写入一个单独的文本文件,该文件显示从数组当前前端到后面的数组元素,而不是来自 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类型的原因,我无法想到任何其他原因:我们提供了函数原型,没有任何函数定义)。

非常感谢你的时间,哦,明智的!

2 个答案:

答案 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];