1.栈的基本实现代码
用栈实现队列首先要建立两个栈,通过这两个栈的出入数据实现队列的出入数据
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
pst->top = 0;
pst->capacity = 0;
}
void STDestroy(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->top = pst->capacity = 0;
}
void STPush(ST* pst, STDataType x)
{
assert(pst);
if (pst->top == pst->capacity)
{
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
void STPop(ST* pst)
{
assert(pst);
pst->top--;
}
STDataType STTop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top == 0;
}
int STSize(ST* pst)
{
assert(pst);
return pst->top;
}
以上就是栈的实现代码 放在上面供大家观看 这是我们用来实现队列的工具
2.初始化队列
先设立两个栈并且将他们初始化 初始化时要判断malloc是否成功
typedef struct MyQueue{
ST S1;
ST S2;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* Queue = (MyQueue*)malloc(sizeof(MyQueue));
if (Queue == NULL)
{
perror("malloc");
}
STInit(&Queue->S1);
STInit(&Queue->S2);
return Queue;
}
3.队列出入数据
因为栈的性质我们需要一个栈在入数据时接收所有数据在出数据时另外一个栈接收所有数据
左边时如数据时的栈情况,右边是出数据时栈的情况
当我们接收数据时就用S1来直接接收
当我们出数据时将S1里面的N-1个传给S2再将S1中剩余的一个数据删除
然后再将S2中的数据传输给S1
代码实现
void myQueuePush(MyQueue* obj, int x) {
STPush(&obj->S1, x);
}
int myQueuePop(MyQueue* obj) {
while (STSize(&obj->S1) > 0)
{
STPush(&obj->S2, STTop(&obj->S1));
STPop(&obj->S1);
}
int TOP = STTop(&obj->S2);
STPop(&obj->S2);
while (STSize(&obj->S2) > 0)
{
STPush(&obj->S1, STTop(&obj->S2));
STPop(&obj->S2);
}
return TOP;
}
4.返回对头数据
返回对头数据和出数据差不多但是s1中留下的那个数据不能删除
代码实现
int myQueuePeek(MyQueue* obj) {
while (STSize(&obj->S1) > 1)
{
STPush(&obj->S2, STTop(&obj->S1));
STPop(&obj->S1);
}
int TOP = STTop(&obj->S1);
while (STSize(&obj->S2) > 0)
{
STPush(&obj->S1, STTop(&obj->S2));
STPop(&obj->S2);
}
return TOP;
}
5.判断队列是否为空
判断队列是否为空只要判断队列中的S1是否为空就行了
bool myQueueEmpty(MyQueue* obj) {
return STEmpty(&obj->S1);
}
6.队列的空间释放
void myQueueFree(MyQueue* obj) {
STDestroy(&obj->S1);
STDestroy(&obj->S2);
free(obj);
}
7.整体代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
typedef struct MyQueue{
ST S1;
ST S2;
} MyQueue;
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
pst->top = 0;
pst->capacity = 0;
}
void STDestroy(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->top = pst->capacity = 0;
}
void STPush(ST* pst, STDataType x)
{
assert(pst);
if (pst->top == pst->capacity)
{
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("realloc fail");
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
void STPop(ST* pst)
{
assert(pst);
pst->top--;
}
STDataType STTop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top == 0;
}
int STSize(ST* pst)
{
assert(pst);
return pst->top;
}
MyQueue* myQueueCreate() {
MyQueue* Queue = (MyQueue*)malloc(sizeof(MyQueue));
if (Queue == NULL)
{
perror("malloc");
}
STInit(&Queue->S1);
STInit(&Queue->S2);
return Queue;
}
void myQueuePush(MyQueue* obj, int x) {
STPush(&obj->S1, x);
}
int myQueuePop(MyQueue* obj) {
while (STSize(&obj->S1) > 0)
{
STPush(&obj->S2, STTop(&obj->S1));
STPop(&obj->S1);
}
int TOP = STTop(&obj->S2);
STPop(&obj->S2);
while (STSize(&obj->S2) > 0)
{
STPush(&obj->S1, STTop(&obj->S2));
STPop(&obj->S2);
}
return TOP;
}
int myQueuePeek(MyQueue* obj) {
while (STSize(&obj->S1) > 1)
{
STPush(&obj->S2, STTop(&obj->S1));
STPop(&obj->S1);
}
int TOP = STTop(&obj->S1);
while (STSize(&obj->S2) > 0)
{
STPush(&obj->S1, STTop(&obj->S2));
STPop(&obj->S2);
}
return TOP;
}
bool myQueueEmpty(MyQueue* obj) {
return STEmpty(&obj->S1);
}
void myQueueFree(MyQueue* obj) {
STDestroy(&obj->S1);
STDestroy(&obj->S2);
free(obj);
}