算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
2017-12-09 10:35
323 查看
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;
}
执行结果:
虽然以数组结构来实现栈的好处是算法设计简单,但如果栈的大小可改变的话,由于数组的大小需事先声明,这时必须使用最大可能性的数组空间来考虑,这样会造成内存空间的浪费。而利用链表来实现栈的优点是随时可以动态改变链表长度。代码如下:
#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;
}
执行结果:
相关文章推荐
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 算法导论第三版第十章 单链表实现栈和队列(思路简单清晰)
- 用链表实现栈和队列对简单数学表达式求值
- 链表实现的简单循环队列
- 算法导论第十章 基本数据结构实现(栈,队列,链表),课后题答案
- 单链表队列的简单实现
- 算法导论12:队列的链表实现 2016.1.12
- 算法导论-------------队列(queue)的简单实现
- 数据结构栈和队列的数组实现和链表实现的4个头文件(完全个人思路)
- 基于链表及环形队列的生产者与消费者简单实现
- LinkedList链表实现队列应用的简单实例
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- 几种基本数据结构--栈、队列、双向链表、有根树的分析和简单实现
- 数据结构学习中的简单问题(一):用链表方式实现的队列输出杨辉三角
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---栈篇