用两个栈实现队列的操作
2016-04-26 20:49
302 查看
只要了解栈和队列的特性,这道题应该就不会有难度,插入元素的时候,都插入到第一个栈,然后删除的时候,可以把第一个栈中的元素全部弹出并压入第二个栈,这样的话第二个栈中的元素与第一个栈的元素顺序相反,先进的元素处于栈顶,可以直接进行删除,这样的话,删除一个元素的步骤是:当第二个栈不为空时,处于栈顶的元素总是最先进入队列的元素,可以弹出,如果第二个栈为空时,把第一个栈中的元素逐个弹出并压入第一个栈即可。如果要插入一个元素,还是压入第一个栈,这样的话后进的还是后出。代码如下:
扩展:使用两个队列实现栈,可以把要插入的元素a,b,c都插入到queue1,
然后要弹出一个元素就是c后插入的要先弹出,然后可以先把前两个元素删除并插入queue2中,这样的话删除c即从栈中弹出c元素,可以用同样的的方法弹出b元素,
要往栈内压入一个元素d,此时queue1中还有一个元素a,把d压入,再从栈内弹出一个元素,后进入的要先弹出,所以要弹出d,可以把a元素删除并插入queue2,然后删除d,即从栈中弹出元素d,
//用两个栈实现队列的删除和插入操作 #include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef struct seqstack { int data[MAXSIZE]; int top; }seqstack; //初始化栈 seqstack *init() { seqstack *s; s=malloc(sizeof(seqstack)); s->top=-1; return s; } //判空栈 int empty(seqstack *s) { if(s->top==-1) return 1; else return 0; } //入栈 int push(seqstack *s,int x) { if(s->top==MAXSIZE-1) return -1; else { s->top++; s->data[s->top]=x; return 0; } } //出栈 int pop(seqstack *s) { if(empty(s)) return -1; else { s->top--; return 0; } } //取栈顶元素 int top(seqstack *s) { int x; if(empty(s)) return -1; else { x=s->data[s->top]; return x; } } void insert(int x,seqstack *s1) //插入队列元素相当于入栈 { push(s1,x); } int delete(seqstack *s1,seqstack *s2) { int x,y; if(empty(s2)) { while(!empty(s1)) { x=top(s1); push(s2,x); pop(s1); } } if(empty(s2)) { printf("empty queue"); return -1; } y=top(s2); return y; } int main() { int a[4]={2,5,1,4}; int i,y=0; seqstack *s1,*s2; s1=init(); s2=init(); for(i=0;i<4;i++) { insert(a[i],s1); } y=delete(s1,s2); printf("%d\n",y); }
扩展:使用两个队列实现栈,可以把要插入的元素a,b,c都插入到queue1,
然后要弹出一个元素就是c后插入的要先弹出,然后可以先把前两个元素删除并插入queue2中,这样的话删除c即从栈中弹出c元素,可以用同样的的方法弹出b元素,
要往栈内压入一个元素d,此时queue1中还有一个元素a,把d压入,再从栈内弹出一个元素,后进入的要先弹出,所以要弹出d,可以把a元素删除并插入queue2,然后删除d,即从栈中弹出元素d,
相关文章推荐
- 后台json数据为空,解析 出现空指针异常
- leetcode 043 Multiply Strings
- 装苹果
- crontab使用
- Exercise(7):和尚挑水
- LeeCode-Two Sum
- 最大公约数的实现
- 67. Add Binary
- android 多个EditText光标的问题
- 谈谈getElementsByClassName()
- Markdown 新手指南
- 1049 最大子段和
- MFC、VC++综合作业题
- 开源项目circular-progress-button源码解析
- LeeCode-Rotate Array
- CCSprite的使用方法
- Tyvj_P1021
- unity AssetBundle 使用方法1
- 解析到数据,但是还是没有 设置到适配器上的问题的解决。
- POJ 1753-Flip Game(枚举&&DFS)