【データ構造---21】スタックでキューの操作を行う

13738 ワード

テーマの説明:
スタックを使用してキューの次の操作を実行します.
push(x) 		--             
pop()			--          
peek()			--          
empty() 		--         
例:MyQue queue=new MyQue()queue.push(1)queue.push(2)queue.peek()///は、1 queue.pop()//を返します.は、1 queue.empty()//を返します.falseを返します
説明:
            --       push to top, peek/pop from top, size,   is empty       
             
      list    deque(    )      ,           
            (  ,           pop    peek   )
まず必要なスタックを構築します.C言語で動的スタックを実現します.
考え方の分析:
1.2つのスタックを使って列のシミュレーションを完成する.1つのスタックは中継要素を補助するために用いられ、1つのスタックは主にデータを保存するために用いられる.3.入隊操作はすべてs 1に対して行い、出隊操作はまずs 1の要素をs 2に押し込んで、s 2のスタックの一番上はチームヘッドであり、値を保存してから削除し、s 2の要素を全部s 1に移動し、元の構造4を回復する.s 2のスタックトップ要素を削除しないだけでいいです.
コードの実装:
typedef struct 
{
    Stack s1;
    Stack s2;
} MyQueue;

/** Initialize your data structure here. */
MyQueue* myQueueCreate()  
{
    MyQueue* SQ=(MyQueue*)malloc(sizeof(MyQueue));
    if(SQ==NULL)
    {
        assert(0);
    }
    StackInit(&SQ->s1);
    StackInit(&SQ->s2);
    return SQ;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) 
{
    StackPush(&obj->s1,x);
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) 
{
    //   Pop   ,      
    while(obj->s1.top>0)
    {
        StackPush(&obj->s2,StackTop(&obj->s1));
        StackPop(&obj->s1);
    }
    int a=StackTop(&obj->s2);
    StackPop(&obj->s2);
    //         
    while(obj->s2.top>0)
    {
        StackPush(&obj->s1,StackTop(&obj->s2));
        StackPop(&obj->s2);
    }
    return a;
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj) 
{
    while(obj->s1.top>0)
    {
        StackPush(&obj->s2,StackTop(&obj->s1));
        StackPop(&obj->s1);
    }
    int a=StackTop(&obj->s2);
    //         
    while(obj->s2.top>0)
    {
        StackPush(&obj->s1,StackTop(&obj->s2));
        StackPop(&obj->s2);
    }
    return a;
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) 
{
    if(StackEmpty(&obj->s2) == -1 && StackEmpty(&obj->s1) == -1)
    {
        return true;
    }
    return false;
}

void myQueueFree(MyQueue* obj) 
{
    free(obj);
    obj=NULL;
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 * int param_2 = myQueuePop(obj);
 * int param_3 = myQueuePeek(obj);
 * bool param_4 = myQueueEmpty(obj);
 * myQueueFree(obj);
*/