int arrayQueue::takeAway()
{
char letter;
if (empty())
return -1;
else {
Data *p, info;
if (top == NULL)
{
cout << "Error stack empty\n";
} else {
p = top; //top is another Data struct instance
info.value = p->value;
top = p->next;
delete p;
return info.value;
}
}
}
对于我的数据结构课程,我们使用指针和链表创建队列,但是我无法弄清楚如何指向FIRST值。现在代码是,它指向输入的最后一个值,这在队列设置中没有用。我搜索了其他示例,但我只能找到使用多个链表的示例。如果有人有任何想法,将不胜感激!
编辑:这是我在队列中添加内容的方式
void arrayQueue::addToQueue(char x)
{
if (full())
cout << "Error, queue full \n";
else {
Data *p;
p = new Data;
p->value = x;
p->next = top;
top = p;
}
}
这是我的结构
struct Data
{
char value;
Data *next;
};
答案 0 :(得分:3)
您应该使用头尾指针实现链接列表。这允许在末尾插入 - enqueue
并从前面dequeue
移除以在恒定时间内完成(O(1))。这是一个简单的队列作为开始:
template
class Queue {
public:
class Node {
T val;
Node* next;
Node(const T& v) : val(v), next(NULL) {}
}
Queue() : head(NULL), tail(NULL), sz(0) {}
void enqueue(const T& v) {
Node* n = new Node(v);
if(sz == 0) {
head = tail = n;
}
else {
tail->next = n;
tail = n;
}
sz++;
}
T dequeue() {
if(sz == 0) throw SomeException;
Node* tmp = head;
head = head->next;
T v = tmp->val;
delete tmp;
sz--;
return v;
}
const T& front() const {return tail->val;}
size_t size() const {return sz;}
bool empty() {return sz == 0;}
private:
Node* head, tail;
size_t sz;
}
答案 1 :(得分:0)
您的单链表应该有两种方法:1)向尾部添加元素,2)从头部删除元素。因此,您的单个链表类应该支持两个指针:一个指向列表的第一个元素,另一个指向列表的最后一个元素。
答案 2 :(得分:0)
听起来你已经将单链接列表实现为更多的堆栈(也就是说,它是FILO,倒数第一)。队列是FIFO(先进先出)结构。要做到这一点,你需要让你的单链表实际上是一个链表(也就是说,你可以从任一端弹出项目)通过添加一个指向head元素的指针(除了尾指针你已经有了),使用双向链接列表实现,或者在遍历列表时将前一个指针保留在内存中以获取需要弹出的项目(例如,您所谓的尾部)。
添加头指针将允许您以恒定时间(O(1)
)关闭项目,而将实现更改为双向链接列表(没有头指针)将需要线性时间({{1 }})。将前一个指针保存在内存中也可以在线性时间内完成。