Post Page Advertisement [Top]


この問題はこのURLを翻訳したものです。

問題 - デッキ(Deque)

整数を格納するデッキを実装し、
入力されるコマンドを処理するプログラムを作成してください。

コマンドは、総八つです。

push_front X:整数Xをデッキの前に入れる。

push_back X:整数Xをデッキの後ろに入れる。

pop_front:デッキの一番前にある数を抜き、その数を出力する。
もし、デッキに入っている整数がない場合には、-1を出力する。

pop_back:デッキの一番後ろにある数を除いては、その数を出力する。
もし、デッキに入っている整数がない場合には、-1を出力する。

size:デッキに入っている整数の数を出力する。

empty:デッキが空の場合1を、そうではない場合は0を出力する。

front:デッキの一番前にある整数を出力する。
もしデッキに入っている整数がない場合には、-1を出力する。


back:デッキの一番後ろにある整数を出力する。
もしデッキに入っている整数がない場合には、-1を出力する。

入力

最初の行に数N(1≤N≤10,000)が与えられます。二つの行からNまでの行には、コマンドが一つずつ与えられます。与えられる整数は1以上で、100,000よりも小さいかあるいは同じです。問題に出されていないコマンドが与えられることはありません。




 入力
出力 
 15
push_back 1
push_front 2
front
back
size
empty
pop_front
pop_back
pop_front
size
empty
pop_back
push_front 3
empty
front
 2
1
2
0
2
1
-1
0
1
-1
0
3





この問題はDequeueの実装を要求しています。

Dequeueの概念はこちらで確認してください。







下は私が簡単に練ったコードです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    static class Deque {
        private int deque[];
        private int end = 0;

        public Deque(int num) {
            deque = new int[num];
        }

        void push_front(int x) {
            for (int i = end; i > 0; i--) {
                deque[i] = deque[i - 1];
            }
            deque[0] = x;
            end++;
        }

        void push_back(int x) {
            deque[end] = x;
            end++;
        }

        int pop_front() {
            int returnValue = deque[0];
            for (int i = 1; i < end; i++) {
                deque[i - 1] = deque[i];
            }
            deque[end-1] = 0;
            end--;
            return returnValue;
        }

        int pop_back() {
            int returnValue = deque[end - 1];
            deque[end - 1] = 0;
            end--;
            return returnValue;
        }

        int size() {
            return end;
        }

        int empty() {
            return deque[0] != 0 ? 0 : 1;
        }

        int front() {
            return deque[0] != 0 ? deque[0] : -1;
        }

        int back() {
            if(end != 0) {
                return deque[end - 1] != 0 ? deque[end - 1] : -1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) throws IOException {

        Scanner sc = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int num = Integer.valueOf(sc.nextLine());

        Deque deque = new Deque(num);
        for (int i = 0; i < num; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            String comand = st.nextToken();
            int value = 0;
            if(st.hasMoreTokens()) {
                value = Integer.parseInt(st.nextToken());
            }
            switch (comand) {
                case "push_front":
                    deque.push_front(value);
                    break;
                case "push_back":
                    deque.push_back(value);
                    break;
                case "pop_front":
                    System.out.println(deque.pop_front());
                    break;
                case "pop_back":
                    System.out.println(deque.pop_back());
                    break;
                case "size":
                    System.out.println(deque.size());
                    break;
                case "empty":
                    System.out.println(deque.empty());
                    break;
                case "front":
                    System.out.println(deque.front());
                    break;
                case "back":
                    System.out.println(deque.back());
                    break;
                default:
                    System.out.println("Error");
                    break;
            }
        }
    }
}

デッキClassとテストクラスが区分されています。



댓글 없음:

댓글 쓰기

Bottom Ad [Post Page]

| Designed by Colorlib