数据结构期末拯救计划:队列

队列也是一种典型的数据存储结构,遵循先进先出的原则队尾进元素,队头删元素,下面看看它的基本操作

#include<iostream>
using namespace std;
typedef struct qnode
{
	int data;
	qnode* next;
}qnode;
typedef struct queue
{
	qnode* head;
	qnode* tail;
	int size;
}queue;
void init(queue* point)
{
	point->head = point->tail = nullptr;
	point->size = 0;
}
void push(queue* point, int x)
{
	qnode* root = new qnode;
	root->data = x;
	root->next = nullptr;
	if (point->head == nullptr)
	{
		point->head = point->tail = root;
		point->size++;
	}
	else
	{
		point->tail->next = root;
		point->tail = root;
		point->size++;
	}
}
void pop(queue* point)
{
	if (point->head != nullptr)
	{
		qnode* root1 = point->head;
		point->head = root1->next;
		delete root1;   
		point->size--;   
	}
}
int size(queue* point)
{
	return point->size;
}
bool empty(queue* point)
{
	return point->head == nullptr;
}

2.栈和队列的配套操作,也是我压的一道题

【问题描述】已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。需采用链式队列与栈(顺序或链式),否则不能得分。

【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素

【输出形式】输出队列的逆置

【样例输入】

3

1 2 3

【样例输出】

3 2 1

题目整体思路:将元素入栈,遵循先进后出的原则,再存储到队列中,此时存储顺序变为3,2,1,而队列遵循先进先出的原则,输出时也是1,2,3,利用这个性质,我们也可以实现两个栈实现队列以及两个队列实现栈的操作

#include<iostream>
#include<stack>
using namespace std;
typedef struct qnode
{
	int data;
	qnode* next;
}qnode;
typedef struct queue
{
	qnode* head;
	qnode* tail;
	int size;
}queue;
void init(queue* point)
{
	point->head = point->tail = nullptr;
	point->size = 0;
}
void push(queue* point, int x)
{
	qnode* root = new qnode;
	root->data = x;
	root->next = nullptr;
	if (point->head == nullptr)
	{
		point->head = point->tail = root;
		point->size++;
	}
	else
	{
		point->tail->next = root;
		point->tail = root;
		point->size++;
	}
}
void pop(queue* point)
{
	if (point->head != nullptr)
	{
		qnode* root1 = point->head;
		point->head = root1->next;
		delete root1;   
		point->size--;   
	}
}
int size(queue* point)
{
	return point->size;
}
bool empty(queue* point)
{
	return point->head == nullptr;
}
void judge(queue* q)
{
	stack<int>st;
	while (!empty(q))
	{
		int front = q->head->data;
		pop(q);
		st.push(front);
	}
	while (!st.empty())
	{
		push(q, st.top());
		st.pop();
	}
}
int getfront(queue* q)
{
	return q->head->data;
}
int main()
{
	queue q;
	init(&q);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		push(&q, x);
	}
	judge(&q);
	while (!empty(&q))
	{
		cout << getfront(&q) << ' ';
		pop(&q);
	}
	return 0;
}

3,循环队列打印杨辉三角形,由于上学期打印过,所以这次也容易考

【问题描述】杨辉三角形的打印,请用循环队列实现。不采用“循环队列”,不给分。

【样例输入】

4
【样例输出】

1

1 1

1 2 1

1 3 3 1

循环队列存储在一个结构体中,结构体底层是一个数组,注意手法,将此结构体的本名写出的前提情况下,需要给出typedef的指针写法以便在初始化队列的过程中给这个结构体分配内存,由于是循环队列,在入队列,出队列时与普通队列的指针移动不同,需要除结构体数组长度,而主函数打印杨辉三角的操作思路如下,首先让一个1入队,因为第一行永远是1,并将这个1入队,然后如果是第2行及以下,则设置两个记录变量t1,t2,然后打印每行的n个元素,把t2的值给t1,然后把t2的值更新为出队列的值,让x再入队列,并输出,在内层循环后,输出不参与计算的结尾1,并将x初始化为1并入队列


#include<iostream>
using namespace std;
typedef struct sq
{
    int a[500];
    int front;
    int rear;
}*queue;
queue init()
{
    queue q;
    q = new sq;
    q->front = q->rear = 0;
    return q;
}
void enter(queue q, int x)
{
    q->a[q->rear] = x;
    q->rear = (q->rear + 1) % 500;
}
int outqueue(queue q)
{
    int x;
    if (q->front == q->rear)
    {
        return 0;
    }
    x = q->a[q->front];
    q->front = (q->front + 1) % 500;
    return x;
}
int main() {
    queue q;
    int x = 1, i;

    cin >> i;
    q = init();
    for (int n = 0; n < i; n++)
    {

        if (n == 0)
        {
            cout << 1 << endl;
            enter(q, x);
        }
        else
        {
            int t1 = 0, t2 = 0;
            for (int r = 0; r < n; r++)
            {
                t1 = t2;
                t2 = outqueue(q);
                x = t1 + t2;
                enter(q, x);
                cout << x << " ";
            }
            cout << 1 << endl;
            x = 1;
            enter(q, x);
        }
    }
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值