学完栈和队列的实现之后可以来做一做这两个题。
思路:
1.将写好的栈接口函数放到leetcode题解之前
数据结构初阶之栈(C语言实现)_何以过春秋的博客-优快云博客
2.用一个栈实现入队列,另一个栈实现出队列,举个例子,两个栈分别起名字pushst和popst,意为入栈和出栈,模仿入队列,给pushst入1 2 3 4 ,此时栈顶为4,然后出栈给popst,进入popst为4 3 2 1 ,此时栈顶为1,再模仿出队列,就可以输出 1 2 3 4 ,达到先进先出的效果,这时呢,pushst又进来5 6 7 此时若想出5 6 7 必须先将1 2 3 4 出完。
typedef struct
{
ST pushst;
ST popst;
} MyQueue;
MyQueue* myQueueCreate()
{
MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
StackInit(&obj->pushst);
StackInit(&obj->popst);
return obj;
}
void myQueuePush(MyQueue* obj, int x)
{
StackPush(&obj->pushst,x);
}
int myQueuePop(MyQueue* obj)
{
//看pop队列中元素是否为空,若为空,则将push队列中元素送到pop中,然后定义(取出)pop的栈顶,出栈并返回
if(StackEmpty(&obj->popst))
{
while(!StackEmpty(&obj->pushst))
{
StackPush(&obj->popst,StackTop(&obj->pushst));
StackPop(&obj->pushst);
}
}
int front=StackTop(&obj->popst);
StackPop(&obj->popst);
return front;
}
int myQueuePeek(MyQueue* obj)
{
if(StackEmpty(&obj->popst))
{
while(!StackEmpty(&obj->pushst))
{
StackPush(&obj->popst,StackTop(&obj->pushst));
StackPop(&obj->pushst);
}
}
return StackTop(&obj->popst);
}
bool myQueueEmpty(MyQueue* obj)
{
return StackEmpty(&obj->popst)&&StackEmpty(&obj->pushst);
}
void myQueueFree(MyQueue* obj)
{
StackDestroy(&obj->popst);
StackDestroy(&obj->pushst);
free(obj);
}
思路:
1.将写好的队列接口函数放到leetcode题解之前
数据结构初阶之队列(C语言实现)_何以过春秋的博客-优快云博客
2.两个空队列,给一个队列,命名为非空,开始入数据,比如1 2 3 4,入完之后,想模拟出栈,则需要将该入好的队列中的数据出队列,也就是将1 2 3 4去另一个队列,该队列命名为空队列,出一个移除一个,出到4时,空队列有1 2 3 ,非空队列有4 ,此时非空队列出栈,出4。
3.想出其他的数据,反复迭代即可。
typedef struct {
Queue q1;
Queue q2;
} MyStack;
MyStack* myStackCreate() {
MyStack*obj=(MyStack*)malloc(sizeof(MyStack));
QueueInit(&obj->q1);
QueueInit(&obj->q2);
return obj;
}
void myStackPush(MyStack* obj, int x) {
if(!QueueEmpty(&obj->q1))
{
QueuePush(&obj->q1,x);
}
else
{
QueuePush(&obj->q2,x);
}
}
int myStackPop(MyStack* obj) {
Queue*emptyQ=&obj->q1;
Queue*nonEmptyQ=&obj->q2;
if(!QueueEmpty(&obj->q1))
{
emptyQ=&obj->q2;
nonEmptyQ=&obj->q1;
}
while(QueueSize(nonEmptyQ)>1)
{
QueuePush(emptyQ,QueueFront(nonEmptyQ));
QueuePop(nonEmptyQ);
}
int top=QueueFront(nonEmptyQ);
QueuePop(nonEmptyQ);
return top;
}
int myStackTop(MyStack* obj) {
if(!QueueEmpty(&obj->q1))
{
return QueueBack(&obj->q1);
}
else
{
return QueueBack(&obj->q2);
}
}
bool myStackEmpty(MyStack* obj) {
return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->q1);
QueueDestroy(&obj->q2);
free(obj);
}
其实这两个题就是考验对栈和队列的性质理解运用。