两个队列实现一个栈
程序员文章站
2022-04-15 20:38:05
...
用两个队列实现一个栈的原理是这样的. 规定两个队列, 必须有一个队列是非空, 一个队列是空.每次入栈时必须往非空队列中入, 而每次出栈时, 必须将非空队列里的元素装到空队列中, 直到非空队列中只有一个元素时, 此时就将剩下的这个元素出栈即可. 而取栈顶元素时, 和出栈一样, 先将非空队列中的元素先装到空队列中, 直到非空队列中只有 一个元素时, 此时就将这个元素去取出来, 然后将其插入到空队列中, (不要忘记每次要将最后的那个元素出栈)
1. 数据结构
typedef struct StackBy2Que
{
SeqQue que1;
SeqQue que2;
}StackBy2Que;
2. 初始化
void StackBy2QueInit(StackBy2Que* stack)
{
if(stack == NULL)
{
return;//非法输入
}
SeqQueInit(&(stack -> que1));
SeqQueInit(&(stack -> que2));
}
3. 入栈
void StackBy2QuePush(StackBy2Que* s, SeqQueType value)
{
if(s == NULL)
{
return;
}
SeqQue input;
SeqQue output;
SeqQueInit(&input);
SeqQueInit(&output);
if(s -> que1.size != 0)
{
SeqQuePush(&(s -> que1), value);
return;
}
SeqQuePush(&(s -> que2), value);
}
4. 出栈
void StackBy2QuePop(StackBy2Que* s)
{
if(s == NULL)
{
return;//非法输入
}
SeqQueType value;
if(s -> que1.size == 0 && s -> que2.size == 0)
{
return;//空队列
}
if(s -> que1.size != 0)
{
while(s -> que1.size > 1)
{
SeqQueGetFront(&(s -> que1), &value);
SeqQuePush(&(s -> que2), value);
SeqQuePop(&(s -> que1));
}
SeqQuePop(&(s -> que1));
return;
}
if(s -> que2.size != 0)
{
while(s -> que2.size > 1)
{
SeqQueGetFront(&(s -> que2), &value);
SeqQuePush(&(s -> que1), value);
SeqQuePop(&(s -> que2));
}
SeqQuePop(&(s -> que2));
return;
}
}
5. 取栈顶元素
int StackBy2QueTop(StackBy2Que* s, SeqQueType* value)
{
if(s == NULL || value == NULL)
{
return -1;//非法输入
}
if(s -> que1.size == 0 && s -> que2.size == 0)
{
return -1;//空栈
}
if(s -> que1.size != 0)
{
while(s -> que1.size > 1)
{
SeqQueGetFront(&(s -> que1), value);
SeqQuePush(&(s -> que2), *value);
SeqQuePop(&(s -> que1));
}
SeqQueGetFront(&(s -> que1), value);
SeqQuePush(&(s -> que2), *value);
return 1;
}
if(s -> que2.size != 0)
{
while(s -> que2.size > 1)
{
SeqQueGetFront(&(s -> que2), value);
SeqQuePush(&(s -> que1), *value);
SeqQuePop(&(s -> que2));
}
SeqQueGetFront(&(s -> que2), value);
SeqQuePush(&(s -> que1), *value);
return 1;
}
}