C ++:队列中的第一个字符是错误的

时间:2013-11-18 14:26:22

标签: c++ pointers queue output

我正在为学校做一项工作,说我应该创建一个队列。它似乎工作。唯一的问题是我的队列开头有一个意外的字符。我使用类CQueue来推送和弹出队列中的值。我必须使用这个类而不是像std :: queue或deque。

这样的东西
class CQueue
{
private:
char *bottom_;
char *top_;
int size_;
public:
CQueue(int n = 20){
    bottom_ = new char[n];
    top_ = bottom_;
    size_ = n;
}

void push(char c){
    *top_ = c;
    top_++;
}

int num_items() {
    return (top_ - bottom_ );
}

char pop(){
    bottom_++;
    return *bottom_;
}

void print(){
    cout << "Queue currently holds " << num_items() << " items: " ;
    for (char *element=top_; element > bottom_; element--) {
        cout << " " << *element;
    }
    cout << "\n";
}

这是我的主要方法:

int main(){


CQueue q(10);

q.push('s');q.push('t');q.push('a');q.push('c');q.push('k');
q.print();
cout << "Popped value is: " << q.pop() << "\n";
q.print();
q.push('!');
q.push('?');
cout << "Popped value is: " << q.pop() << "\n";
q.print();

while (!q.empty()) q.pop();
if (q.num_items() != 0) {
    cout << "Error: Stack is corrupt!\n";
}
q.print();
cout << "End of program reached\n"<< endl;
return 0;

当我运行此代码时,队列被填充但* bottom_被替换为'='符号。这是我的输出:

Queue currently holds 5 items:  ═ k c a t
Popped value is: t
Queue currently holds 4 items:  ═ k c a
Popped value is: a
Queue currently holds 5 items:  ═ ? ! k c
Queue currently holds 0 items:
End of program reached

我现在已经在这个问题上敲了一会儿,所以我希望你能对这个问题有所了解!

4 个答案:

答案 0 :(得分:1)

在您定义push()后,*top_在队列中 NOT 。 队列结束后是的一个元素。因此,您应该定义print()以从top_ - 1进行迭代。

同样如@stellarossa所述,你应该在增加之前返回bottom_指向的字符。也就是说,

char pop() { return *(bottom_++); }

答案 1 :(得分:0)

char pop(){
    bottom_++;
    return *bottom_;
}

您正在递增指针然后返回值。它应该是另一种方式。

答案 2 :(得分:0)

您使用的是数组或链表吗?

保持简单并使用带有count变量的数组。

#include <iostream>
using namespace std;
class CQueue
{
private:
char * q;
int size_;
int count;
public:
CQueue(int n = 20){
    q = new char[n];
    size_ = n;
    count = 0;
}

void push(char c){
    assert(count != size);
    q[count] = c;
    count++;
}

int num_items() {
    return count;
}

char pop() {
    assert(count != 0);
    char ret = q[count-1];
    count--;
    return ret; 
}

void print(){
    cout << "Queue currently holds " << num_items() << " items: " ;
    for (int i = 0; i < count; i++) {
        cout << " " << q[i];
    }
    cout << "\n";
}

答案 3 :(得分:0)

我的朋友至少有两个错误。

1)print()方法开始打印* top,它是最后一个成员的1。应该是:

for (char *element=top_-1; element >= bottom_; element--) {
    cout << " " << *element;
}

2)pop()方法错误: 应该是:

char pop(){
    return (top_ > bottom_) ? *top_-- : 0;
}