用两个队列实现一个栈的原理是这样的. 规定两个队列, 必须有一个队列是非空, 一个队列是空.每次入栈时必须往非空队列中入, 而每次出栈时, 必须将非空队列里的元素装到空队列中, 直到非空队列中只有一个元素时, 此时就将剩下的这个元素出栈即可. 而取栈顶元素时, 和出栈一样, 先将非空队列中的元素先装到空队列中, 直到非空队列中只有 一个元素时, 此时就将这个元素去取出来, 然后将其插入到空队列中, (不要忘记每次要将最后的那个元素出栈)
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;}
}