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

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;
}

执行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值