PTA 数据结构与算法 7-22 堆栈模拟队列
如有不对,不吝赐教
直接进入正题:
设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。
所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:
int IsFull(Stack S):判断堆栈S是否已满,返回1或0;
int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0;
void Push(Stack S, ElementType item ):将元素item压入堆栈S;
ElementType Pop(Stack S ):删除并返回S的栈顶元素。
实现队列的操作,即入队void AddQ(ElementType item)和出队ElementType DeleteQ()。
输入格式:
输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。
输出格式:
对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。
输入样例:
3 2
A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T
输出样例:
ERROR:Full
1
ERROR:Full
2
3
4
7
8
ERROR:Empty
其实我不理解为什么非得要用两个栈去模拟队列估计这样可以加深对栈的理解吧
其实这道题目的关键在于如何搭配这些操作:
下面用small表示容量较小的栈,large表示较大的栈
AddQ:
1.small没满,large为空,直接加入small中
2.small满了,large为空,把small的元素全倒入large中,此时large中的元素按照输入顺序
3.small满了,large不为空,报错
DeleteQ:
1.large中有元素,直接Pop
2.large中没有元素,small中有元素,把small中的元素倒入large中,在Pop
3.small与large中都没有元素,报错
如果看文字困难的话,可以照着文字画下图加深理解
下面给出代码:
#include<stdio.h> #include<malloc.h> #define BUG 99999 struct Stack{ int volume; //栈的容量 int tail; //最后一个元素的个数 int *data; //数据 }; struct Stack *large,*small; //大小两个栈 void AddQ(int item); int DeleteQ(void); int IsFull(char s); //栈的名字 int IsEmpty(char s); void Push(char s,int item); int Pop(char s); int main(void) { int N1,N2; int item; char ch; //输入操作及数据 fscanf(stdin,"%d %d",&N1,&N2); fscanf(stdin,"%c",&ch); //读入空格 large=(struct Stack *)malloc(sizeof(struct Stack)); small=(struct Stack *)malloc(sizeof(struct Stack)); large->volume=N1>N2?N1:N2; large->data=(int *)malloc(large->volume*sizeof(int)); large->tail=-1; small->volume=N1<N2?N1:N2; small->data=(int *)malloc(small->volume*sizeof(int)); small->tail=-1; //给大小两个栈分配空间 while(fscanf(stdin,"%c",&ch),'T'!=ch){ if('A'==ch){ fscanf(stdin,"%d",&item); AddQ(item); } else{ item=DeleteQ(); if(BUG!=item) printf("%d\n",item); } fscanf(stdin,"%c",&ch); //读入空格 } return 0; } 20000 int IsFull(char s) { if('l'==s) return large->tail==large->volume-1; else return small->tail==small->volume-1; } int IsEmpty(char s) { if('l'==s) return large->tail==-1; else return small->tail==-1; } void Push(char s,int item) { struct Stack *stack; if('l'==s) stack=large; else stack=small; stack->data[++(stack->tail)]=item; return ; } int Pop(char s) { struct Stack *stack; if('l'==s) stack=large; else stack=small; return stack->data[stack->tail--]; } void AddQ(int item) { if(!IsFull('s')) Push('s',item); else if(IsEmpty('l')){ while(!IsEmpty('s')) Push('l',Pop('s')); Push('s',item); } else printf("ERROR:Full\n"); return ; } int DeleteQ(void) { int result=BUG; if(!IsEmpty('l')) result=Pop('l'); else if(!IsEmpty('s')){ while(!IsEmpty('s')) Push('l',Pop('s')); result=Pop('l'); } else printf("ERROR:Empty\n"); return result; }
结果:
- 数据结构之堆栈模拟应用(算法3.1)
- 【算法学习笔记】06.数据结构基础 队列与堆栈初步
- PTA-数据结构 5-18 银行业务队列简单模拟 (25分)
- PTA 数据结构与算法 7-26 Windows消息队列
- Java使用LinkedList模拟一个堆栈或者队列数据结构
- 数据结构与算法 JavaScript实现 —— 队列(模拟发票,按票价排队)
- 使用LinkedList来模拟一个堆栈或者队列数据结构
- C++队列模拟银行排队叫号(加州大学伯克利分校计算机专业数据结构与算法作业)
- 使用LinkedList模拟一个堆栈或者队列数据结构
- 集合框架---使用LinkedList模拟一个堆栈或者队列数据结构
- 使用LinkedList模拟一个堆栈或者队列数据结构
- 【数据结构与算法C】利用两个栈S1S2模拟一个队列,用栈的基本操作实线EnQueue,DeQueue,QueueEmpty
- 【算法学习笔记】06.数据结构基础 队列与堆栈初步
- 用数组实现js中的堆栈 或者队列数据结构
- PTA 数据结构与算法题目集(中文)6-1
- javascript数据结构与算法---队列
- PTA 数据结构与算法题目集(中文)5-5 堆中的路径 (25分)
- [翻译]C#数据结构与算法 – 第五章栈与队列(Part 1)
- Java数据结构与算法解析(十三)——优先级队列
- 数据结构与算法问题 堆栈使用 2011年吉林大学计算机研究生机试真题