1、题目展示
前面我们了解过如何实现栈相关的代码,如果有遗忘或不熟悉可以回看:
下面我们直接进入正文。
2、题目分析
本题与博主前一篇博客中的使用队列实现栈有大相径庭的部分,但又有一些出入,我们知道栈与队列的区别是前者为后进先出,后者为先进先出,故当我们使用栈来实现队列相关的内容时,需要加以分析。
我们同样的使用两个栈来进行队列功能的实现,假设一个场景,我们需要先将1,2,3,4四个数据输入至队列中,及s1或s2中(二者皆可)。
当我们需要从由栈组成的队列中删除或哪取数据时,在栈先进先出的前提下,我们可以直接将s1中的4,3,2通过栈的输出导入至s2中。
此时我们的s1中只剩下了数据1,这时候便可以直接进行取数据或删除数据的操作。
此时我们假设将数据1删除后有插入了数据5和6,为了方便起见我们不再选择有数据的那一个栈来进行插入操作,反而使用没有数据的那一个,这样的情况下,如果我们需要继续输出或删除数据,我们便可以直接通过STTop对最先插入栈中的数据进行操作。
既然这样,我们为了方便理解,不如将s1记作pushst,s2记作popst。便有了下图的结果。
而判断队列是否为空的逻辑思路显而易见,直接判断两个栈是否都为空即可。
3、完整代码演示
我们在完成这一道题目时,因为是oj题目,所以在需要完成的功能函数前需要自行书写栈的相关内容代码,故不在此展示,有需要者可在标题1中自行寻找link链接。
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST,*pST;
//初始化栈
void STInit(pST pst)
{
assert(pst);
pst->a = NULL;
pst->top = 0;
pst->capacity = 0;
}
//销毁栈
void STDestroy(pST pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->top = pst->capacity = 0;
}
//入栈
void STPush(pST pst, STDataType x)
{
assert(pst);
if (pst->top == pst->capacity)
{
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp = realloc(pst->a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("STPush:relloc");
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
//出栈
void STPop(pST pst)
{
assert(pst);
assert(pst->top > 0);
pst->top--;
}
//取栈顶数据
STDataType STTop(pST pst)
{
assert(pst);
assert(pst->top > 0);
return pst->a[pst->top - 1];
}
//判断空
bool STEmpty(pST pst)
{
assert(pst);
return pst->top == 0;
}
//数据个数
int STSize(pST pst)
{
assert(pst);
return pst->top;
}
typedef struct
{
ST pushst;
ST popst;
} MyQueue;
MyQueue* myQueueCreate()
{
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
STInit(&(obj->pushst));
STInit(&(obj->popst));
return obj;
}
void myQueuePush(MyQueue* obj, int x)
{
STPush(&(obj->pushst),x);
}
int myQueuePop(MyQueue* obj)
{
int front = myQueuePeek(obj);
STPop(&(obj->popst));
return front;
}
int myQueuePeek(MyQueue* obj)
{
if(STEmpty(&(obj->popst)))
{
while(!STEmpty(&(obj->pushst)))
{
STPush(&(obj->popst),STTop(&(obj->pushst)));
STPop(&(obj->pushst));
}
}
return STTop(&(obj->popst));
}
bool myQueueEmpty(MyQueue* obj)
{
return STEmpty(&(obj->pushst)) && STEmpty(&(obj->popst));
}
void myQueueFree(MyQueue* obj)
{
STDestroy(&(obj->pushst));
STDestroy(&(obj->popst));
free(obj);
}
4、结语
十分感谢您观看我的原创文章。
本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
如需引用,注明地址。
;