????用兩個隊列實現一個棧的原理是這樣的. 規定兩個隊列, 必須有一個隊列是非空, 一個隊列是空.每次入棧時必須往非空隊列中入, 而每次出棧時, 必須將非空隊列里的元素裝到空隊列中, 直到非空隊列中只有一個元素時, 此時就將剩下的這個元素出棧即可. 而取棧頂元素時, 和出棧一樣, 先將非空隊列中的元素先裝到空隊列中, 直到非空隊列中只有 一個元素時, 此時就將這個元素去取出來, 然后將其插入到空隊列中, (不要忘記每次要將最后的那個元素出棧)
????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;}
}