《剑指Offer》面试题:用两个栈来实现一个队列

题目描述:

用两个栈来实现一个队列,完成队列的Push和Pop操作。
队列中的元素为int类型。

/*

输入:
每个输入文件包含一个测试样例。
对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数。
接下来的n行,每行输入一个队列操作:
1.  PUSH X 向队列中push一个整数x(x>=0)
2.  POP 从队列中pop一个数。
输出:
对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。
样例输入:
3
PUSH 10
POP
POP
样例输出:
10
-1
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Node{
    int data;
    struct Node *pNext;
};

struct Stack{
    Node *pTop;
    Node *pButtom;
};
//功能:创建一个空栈
Stack *createStack(){
    Stack *s=(Stack *)malloc(sizeof(struct Stack));
    s->pTop=(Node *)malloc(sizeof(struct Node));
    if(s==NULL||s->pTop==NULL){
        exit(EXIT_FAILURE);
    }
    s->pButtom=s->pTop;
    s->pButtom->pNext=NULL;
    return s;
} 
//功能:检测一个栈是否为空
bool isEmpty(Stack *pS){
    if(pS->pTop==pS->pButtom){
        return true;
    }
    return false;
} 

//功能:进栈 
void push_stack(Stack *pS1,int data){
    if(pS1==NULL){
        return;
    }
    Node* newNode=(Node *)malloc(sizeof(Node));
    if(newNode==NULL){
        exit(EXIT_FAILURE);
    }
    newNode->data=data;
    newNode->pNext=pS1->pTop;
    pS1->pTop=newNode;
    return;

}

//进队列 
void enterQueue(Stack *pS1,int data){
    //将数据压入到第一个栈中 
    push_stack(pS1,data); 
}
//出栈,并将数据保存到pData中 
bool pop_stack(Stack *pS,int *pData){
    if(isEmpty(pS)){
        return false;
    }
    //第一步:先将栈顶的元素取出。 
    Node *pNode=pS->pTop;
    *pData=pNode->data;
    //第二步:改变栈顶指针到其下一个元素的位置。 
    pS->pTop=pNode->pNext;
    //第三步:将该结点所占有的空间销毁。 
    free(pNode);
    pNode=NULL;
    return true;    
}
//出队列 
//用两个队列来模拟出队列  
bool  outQueue(Stack *pS1,Stack *pS2,int *pData){
    if(isEmpty(pS1)&&isEmpty(pS2)){
        return false;
    }
    //第二个栈不为空时,直接输出这个栈的顶端元素即可。 
    if(!isEmpty(pS2)){
        pop_stack(pS2,pData);
        return true;
    }
    else{//如果第二个栈为空,则将第一个栈的所有元素放到第一个栈啦。 
        if(!isEmpty(pS1)){
            //先将第一个栈的元素出栈,即为pTempData; 
            //再将元素进栈到第二个栈 
            while(!isEmpty(pS1)){
                int pTempData;
                pop_stack(pS1,&pTempData); 
                push_stack(pS2,pTempData);
            }
            pop_stack(pS2,pData);
            return true;            
        }
    } 

    return  false;
} 

int main(void){
    int n;
    while(scanf("%d",&n)!=EOF&&n>0){
        //先创建两个空栈
        Stack *pS1=createStack();
        Stack *pS2=createStack(); 
        char push[]="PUSH";
        char pop[]="POP";
        char input[5];//用来接收输入的字符,到底是PUSH 还是POP
        int data;//用来保存要进队列的数。
        int pData;//用来保存POP出来的数据。 
        for(int i=0;i<n;i++){
            scanf("%s",input);
            //完成push操作 
            if(strcmp(input,push)==0){
                scanf("%d",&data);
                //进队列就是先进入到pS1的栈中 
                enterQueue(pS1,data);
            }
            else if(strcmp(input,pop)==0){
                //完成pop操作
                if(outQueue(pS1,pS2,&pData)) {
                    printf("%d ",pData);
                }
                else{
                    printf("-1\n");
                }
            }
            else{
                printf("输入错误\n");
            } 
        }
    }

    return 0;
}

此题的思路比较简单,细节问题还是有很多需要注意的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值