【剑指Offer】题7:用两个栈实现队列

题目描述:

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

输入:

每个输入文件包含一个测试样例。
对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数。
接下来的n行,每行输入一个队列操作:
1. PUSH X 向队列中push一个整数x(x>=0)
2. POP 从队列中pop一个数。

输出:

对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。

输出:

对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。

样例输入:
3
PUSH 10
POP
POP

样例输出:

10
-1

解法:2个栈,栈s1用于进队,栈s2用于出队,出队的栈s2有元素时,s1不能往s2中入栈,而s1出栈的时候 也必须一次性全部弹出,不然都会导致先入栈的后出去,破坏队列规则。而具体是入队的s1,检查s2为空并全部s1到s2,还是出队的时候检查。2种方式自由选择。(注:用线性表表示栈时,元素数组最好malloc,用固定数组在九度oj 超时了)。
而改用malloc 速度立马提升。

malloc的空间要随时回收,养成好习惯。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
typedef int T;
typedef struct stack{
    int Top,MaxStack;
    T *Elements;
}Stack;
 
typedef struct queue {
    Stack s1,s2;
}Queue;
 
void init(Stack *st,int size) {
    st->Top=-1;
    st->MaxStack=size;
    st->Elements = (int*)malloc(size*sizeof(int));
}
 
int isEmpty(Stack s) {
    if(s.Top<0) return 1;
    else return 0 ; 
}
 
int isFull(Stack s) {
    if(s.Top==s.MaxStack-1) return 1; 
    else return 0 ; 
}
void pop(Stack *stack,T *x) {
    if(isEmpty(*stack)) {
        printf("has no element!");
    }else {
        *x = stack->Elements[stack->Top--];
    }
 
}
void push(Stack *stack,T x) {
    if(isFull(*stack)) {
        printf("OverFlow!");
        return ;
    } 
    stack->Elements[++stack->Top]=x;
}
 
 
 
void initQueue(Queue *q,int size) {
    init(&(q->s1),size);
    init(&(q->s2),size);
}
 
void appendTail(Queue *q,T x) {
    if(!isFull(q->s1))push(&(q->s1),x);
}
 
 
/*
    栈1用于进队列
    栈2用于出队列,
    当出队列的时候,如果栈2为空,就把栈1全部入到栈2,如果不为空 直接弹出栈2栈顶。
*/
T deleteHead(Queue *q) {
    T x;
    if(isEmpty(q->s2)) {
        while(!isEmpty(q->s1)) {
            pop(&(q->s1),&x);
            push(&(q->s2),x);
             
        }
    }
    if(!isEmpty(q->s2))pop(&(q->s2),&x);
    else return -1;//两个栈都没元素了,返回-1空
 
    return x; 
     
}
 
void print(Stack st) {
    int i ; 
    for(i=st.Top;i>=0;i--) {
        printf("%d ",st.Elements[i]);
    }
}
 
void main() {
    Queue q;
    int n ,num; 
    char str[5]={0};
    scanf("%d",&n);
    initQueue(&q,n);
    while(n-->0) {
        scanf("%s",str);
        if(strcmp(str,"PUSH")==0) {
            scanf("%d",&num);
            appendTail(&q,num);
        }
 
 
        if(strcmp(str,"POP")==0) {
 
            printf("%d\n",deleteHead(&q));
        }
     
    }
    free(q.s1.Elements);
    free(q.s2.Elements);
         
     
     
}
 
 
 
/**************************************************************
    Problem: 1512
    User: tcals
    Language: C
    Result: Accepted
    Time:70 ms
    Memory:1696 kb
****************************************************************/


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值