队列基础
先进先出:FIFO。
循环队列:顺序存储方式(取余),队列假溢出。
队列是尾添加头弹出。
代码实现:
#include<stdio.h>
typedef struct node
{
int val;
struct node* next;
}Data;
typedef struct node2
{
int count;
Data* head;
Data* tail;
}Queue;
void Init(Queue** que)
{
*que = (Queue*)malloc(sizeof(Queue));
(*que)->count = 0;
(*que)->head = NULL;
(*que)->tail = NULL;
}
void Push(Queue* que,int num)
{
if (que == NULL)return;
Data* ptem = (Data*)malloc(sizeof(Data));
ptem->val = num;
ptem->next = NULL;
if (que->head == NULL)
que->head = ptem;
else
que->tail->next = ptem;
que->tail = ptem;
que->count++;
}
void Pop(Queue* que)
{
if (que == NULL)return;
if (que->count == 0)return;
printf("%d ", que->head->val);
Data* dele = que->head;
que->head = que->head->next;
free(dele);
dele = NULL;
que->count--;
//tail不知道head释放了,把尾指针赋空,要不然成野地址了
if(que->count==0)
que->tail = NULL;
}
int main()
{
Queue* que = NULL;
Init(&que);
Push(que, 1);
Push(que, 2);
Push(que, 3);
Push(que, 4);
Pop(que);
Pop(que);
Pop(que);
Pop(que);
return 0;
}
两个栈实现队列
例:输入1 2 3 4,队列出来应该还是1 2 3 4,下面我们用栈实现一下。
(1)1 2 3 4入栈s1
(2)想要以1 2 3 4顺序出栈那我们应该把s1里数据放s2中,按顺序出栈。
我们再完善一下思路,写出push,pop函数:
Push:栈s2是否为空:(1)是:s2的数出栈给s1,新的数据再给s1。(2)否:新的数据给s1。
Pop:栈s1是否为空:(1)是:s1的数出栈给s2,s2弹出。(2)否:s2弹出。
#include<iostream>
#include<stack>
using namespace std;
void Push(stack<int>& s1, stack<int>& s2,int num)
{
while (!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
s1.push(num);
}
void Pop(stack<int>& s1, stack<int>& s2)
{
if (s1.empty() && s2.empty())return;
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
int temp=s2.top();
cout << temp << endl;
s2.pop();
}
int main()
{
stack<int>s1;
stack<int>s2;
Push(s1, s2, 1);
Push(s1, s2, 2);
Push(s1, s2, 3);
Push(s1, s2, 4);
Push(s1, s2, 5);
Pop(s1, s2);
Pop(s1, s2);
Pop(s1, s2);
Pop(s1, s2);
Pop(s1, s2);
return 0;
}
两个队列实现栈
例:1 2 3 4输出:4 3 2 1.
(1)1 2 3 4,进入一个非空队列(如果两个都是空的进q1).
(2)除尾以外全进入空队列。
(3)尾pop。
重复(2)(3)步,直到为空。
#include<iostream>
#include<queue>
using namespace std;
void Push(queue<int>& q1, queue<int>& q2,int num)
{
if (!q1.empty())q1.push(num);
else q2.push(num);
}
void Pop(queue<int>& q1, queue<int>& q2)
{
if (q1.empty() && q2.empty())return;
if(!q1.empty())
{while (q1.size() > 1)
{
q2.push(q1.front());
q1.pop();
}
cout << q1.front() << endl;
q1.pop();
}
else
{
while (q2.size() > 1)
{
q1.push(q2.front());
q2.pop();
}
cout << q2.front() << endl;
q2.pop();
}
}
int main()
{
queue<int>q1;
queue<int>q2;
Push(q1, q2, 1);
Push(q1, q2, 2);
Push(q1, q2, 3);
Push(q1, q2, 4);
Pop(q1, q2);
Pop(q1, q2);
Pop(q1, q2);
Pop(q1, q2);
return 0;
}