【九度】题目1415:不一样的循环队列
来源:互联网 发布:nginx cgi c 编辑:程序博客网 时间:2024/06/06 18:25
- 题目地址:http://ac.jobdu.com/problem.php?pid=1415
题目描述: 大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有5条指令:
(1) Push K, 让元素K进队列。
(2) Pop,对头元素出队列。
(3) Query K,查找队列中第K个元素,注意K的合法性。
(4) Isempty,判断队列是否为空。
(5) Isfull,判断队列是否已满。
现在有N行指令,并且告诉你队列大小是M。
- 输入:
第一行包含两个整数N和M。1<=N,M<=100000。
接下来有N行,表示指令,指令格式见题目描述。
其中元素均在int范围。
- 输出:
对于指令(1),若队列已满,输出failed,否则不做输出。
对于指令(2),若队列已空,输出failed,否则不做输出。
对于指令(3),输出队列中第K个元素,若不存在,输出failed。
对于指令(4)和(5),则用yes或者no回答。
详情见样例。
- 样例输入:
12 2
Push 1
Push 2
Push 3
Query 2
Query 3
Isempty
Isfull
Pop
Pop
Pop
Isempty
Isfull
- 样例输出:
failed
2
failed
no
yes
failed
yes
no
循环队列,底层实现是数组,给出Java和C++的实现。
其实可以不用结构体,直接数组就可以。
C++ AC
#include <stdio.h>#include <string>#include <string.h>using namespace std;#define INF 10000000;const int maxm = 100002;struct QueueLoop{ int array[maxm]; int front; int rear;};QueueLoop queue;int n,m,i;int len; bool IsEmpty(){ int front = queue.front; int rear = queue.rear; if (rear == front) { return true; } return false; }bool Isfull(){ int front = queue.front; int rear = queue.rear; if ((rear + 1) % len == front) { return true; } return false; } bool pushElement(int k){ if (Isfull()) { return false; } int rear = queue.rear; queue.array[rear] = k; queue.rear = (rear+1) % len; return true;} bool popElement(){ if (IsEmpty()) { return false; } int front = queue.front; queue.front = (front+1) % len; return true;} void queryElement(int k){ int front = queue.front; int rear = queue.rear; if ( k <= 0 || rear - front < k) { printf("failed\n"); }else{ printf("%d\n",queue.array[k + front - 1]); }} int main(){ while(scanf("%d%d",&n,&m) != EOF){ queue.front = 0; queue.rear = 0; len = m+1; char operate[15]; for(i = 0 ; i < n; i++){ scanf("%s",operate); if (strcmp(operate,"Push") == 0) { int k; scanf("%d",&k); if (!pushElement(k)) { printf("failed\n"); } }else if (strcmp(operate,"Pop") == 0) { if (!popElement()) { printf("failed\n"); } }else if (strcmp(operate,"Query") == 0) { int k; scanf("%d",&k); queryElement(k); }else if (strcmp(operate,"Isempty") == 0) { printf("%s\n",IsEmpty() == true ? "yes" :"no"); }else { printf("%s\n",Isfull() == true ? "yes" :"no"); } } } return 0;}/************************************************************** Problem: 1415 User: wangzhenqing Language: C++ Result: Accepted Time:130 ms Memory:1412 kb****************************************************************/
Java AC 做法1
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StreamTokenizer; public class Main { /* * 1415 */ private static QueueLoop queue; private static int len; public static void main(String[] args) throws Exception{ StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; st.nextToken(); int m = (int) st.nval; queue = new QueueLoop(m); len = m + 1; while (n > 0) { n--; st.nextToken(); String operate = st.sval; if (operate.equals("Push")) { st.nextToken(); int k = (int) st.nval; if (!pushElement(k)) { System.out.println("failed"); } }else if (operate.equals("Pop")) { if (!popElement()) { System.out.println("failed"); } }else if (operate.equals("Query")) { st.nextToken(); int k = (int) st.nval; Integer value = queryElement(k); if (value == null) { System.out.println("failed"); }else { System.out.println(value); } }else if (operate.equals("Isempty")) { System.out.println(IsEmpty() == true ? "yes" :"no"); }else { System.out.println(Isfull() == true ? "yes" :"no"); } } } } private static boolean pushElement(int k){ if (Isfull()) { return false; } int rear = queue.rear; int array[] = queue.array; array[rear] = k; queue.array = array; queue.rear = (rear+1) % len; return true; } private static boolean popElement(){ if (IsEmpty()) { return false; } int front = queue.front; queue.front = (front+1) % len; return true; } private static Integer queryElement(int k){ int front = queue.front; int rear = queue.rear; int array[] = queue.array; if ( k <= 0 || rear - front < k) { return null; } return array[k + front - 1]; } private static boolean IsEmpty(){ int front = queue.front; int rear = queue.rear; if (rear == front) { return true; } return false; } private static boolean Isfull(){ int front = queue.front; int rear = queue.rear; if ((rear + 1) % len == front) { return true; } return false; } public static class QueueLoop{ int array[]; int front; int rear; public QueueLoop(int[] array, int front, int rear) { super(); this.array = array; this.front = front; this.rear = rear; } public QueueLoop(int size) { array = new int[size+1]; front = 0; rear = 0; } public QueueLoop() { super(); } }} /************************************************************** Problem: 1415 User: wzqwsrf Language: Java Result: Accepted Time:2280 ms Memory:43496 kb****************************************************************/
Java AC 做法2
import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.StreamTokenizer; public class Main { /* * 1415 */ private static int array[]; private static int front , rear; public static void main(String[] args) throws Exception{ StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); while (st.nextToken() != StreamTokenizer.TT_EOF) { int n = (int) st.nval; st.nextToken(); int m = (int) st.nval; array = new int[m+1]; front = rear = -1; while (n > 0) { n--; st.nextToken(); String operate = st.sval; if (operate.equals("Push")) { st.nextToken(); int k = (int) st.nval; if (rear - front == m) { System.out.println("failed"); }else { rear ++; array[rear] = k; } }else if (operate.equals("Pop")) { if (front == rear) { System.out.println("failed"); }else { front++; } }else if (operate.equals("Query")) { st.nextToken(); int k = (int) st.nval; if ( k <= 0 || rear - front < k) { System.out.println("failed"); }else { System.out.println(array[front + k]); } }else if (operate.equals("Isempty")) { System.out.println(rear == front ? "yes" :"no"); }else { System.out.println(rear - front == m ? "yes" :"no"); } } } }} /************************************************************** Problem: 1415 User: wzqwsrf Language: Java Result: Accepted Time:2190 ms Memory:42104 kb****************************************************************/
0 0
- 【九度】题目1415:不一样的循环队列
- 九度 1415 不一样的循环队列 【数据结构】
- 不一样的循环队列
- 不一样的for循环
- 题目1512:用两个栈实现队列-九度
- 【九度】题目1512:用两个栈实现队列
- 九度oj 题目1512:用两个栈实现队列
- 九度_题目1512:用两个栈实现队列
- 九度OJ-题目1512:用两个栈实现队列
- 九度OJ 1412(卡特兰数) 1413(未完成) 1414(未完成) 1415(循环队列) 1416(排序)
- 题目1369:字符串的排列-九度
- 【九度】题目1482:玛雅人的密码
- 九度题目1088:剩下的树
- 九度题目1108:堆栈的使用
- 九度题目1088:剩下的树
- 九度题目1341:艾薇儿的演唱会
- 九度题目1087:约数的个数
- 九度 题目1369:字符串的排列
- Spring AOP介绍
- js导出Excel浏览器兼容
- scp和rsync限速传输
- XML CDATA介绍
- JBoss入门体验
- 【九度】题目1415:不一样的循环队列
- adb的一些命令
- iOS NSInvocation的学习
- 使用python测测你的系统最多能创建多少个线程
- Yii内部的文件上传
- Java连接Mysql数据库
- 交换链表结点
- AOP思考
- 【IERG4130学习笔记】Smashing the stack for fun and profit中souce code加上一点儿注释