-
题目描述:
-
用两个栈来实现一个队列,完成队列的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 ****************************************************************/