您的位置:首页 > 编程语言 > C语言/C++

算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)

2017-12-09 10:35 495 查看
1.单链表实现栈

虽然以数组结构来实现栈的好处是算法设计简单,但如果栈的大小可改变的话,由于数组的大小需事先声明,这时必须使用最大可能性的数组空间来考虑,这样会造成内存空间的浪费。而利用链表来实现栈的优点是随时可以动态改变链表长度。代码如下:

#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
class listnode {
public:
int data;//栈数据的声明
listnode* next;//栈中用来指向下一个结点
listnode(int x) :data(x), next(nullptr) {}

};
listnode* top = nullptr;//指向栈顶的指针
int isempty()
{
if (top == nullptr)
return 1;
else return 0;
}

void push(int data)
{
listnode* new_add_node=new listnode(0);//新加入结点的指针
new_add_node->data = data;//将新传入的值指定为结点的内容
new_add_node->next = top;//将新结点指向栈的顶端
top = new_add_node;//新结点成为栈的顶端

}

int pop()
{
listnode* ptr;//指向栈顶端的指针
int temp;
if (isempty())//判断栈是否为空
{
cout << "===目前为空栈===" << endl;
return -1;
}
else {
ptr = top;//指向栈的顶端
top = top->next;//将栈顶端的指针指向下一个结点
temp = ptr->data;//取出栈的数据
free(ptr);//释放结点空间
return temp;
}
}

int main()
{
int value;
int i;
cout << "依次输入十个数据:" << endl;
for (i = 0; i < 10; i++)
{
cin >> value;
push(value);
}
cout << "===================" << endl;
while (!isempty())
cout << "栈弹出的顺序为:" << setw(2) << pop() << endl;
system("pause");
return 0;
}执行结果:



2.单链表实现队列

声明队列的类别时除了具有队列类别中相关的方法外,还必须具有指向队列前段及队列尾端的指针,即front及rear,代码如下:

#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
class listnode {
public:
int data;
class listnode* next;
listnode(int x) :data(x), next(nullptr) {}
};
listnode* front = nullptr;
listnode* rear = nullptr;
//入队
void enqueue(int value)
{
listnode* node = new listnode(value);
if (rear == nullptr)
front = node;
else
rear->next = node;
rear = node;
}
//出队
int dequeue()
{
int value;
if (!(front == nullptr))
{
if (front == rear) rear = nullptr;
value = front->data;
front = front->next;
return value;
}
else return -1;
}

int main()
{
int temp,value;
cout << "以链表实现队列" << endl;
cout << "=================" << endl;
cout << "依次输入五个数据入队:" << endl;
for (int i = 0; i < 5; i++)
{
cin >> value;
enqueue(value);
}
while (1)
{
if (!(front == nullptr))
{
temp = dequeue();
cout << "从队列前段出队的数据为:" << setw(1) << temp << endl;
}
else
break;
}
cout << endl;
system("pause");
return 0;
}

执行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐