[56] 두 스택을 사용하여 큐 구현 | 피보나치 시퀀스

두 개의 스택으로 대기열 구현

문제 설명

두 개의 스택이있는 대기열을 구현합니다. 큐의 선언은 다음과 같으며, 큐의 끝에 정수를 삽입하고 큐의 선두에 정수를 삭제하는 기능을 각각 완료하는 appendTail과 deleteHead의 두 함수를 구현하십시오. (큐에 요소가없는 경우 deleteHead 작업은 -1을 반환합니다.)

문제 해결 아이디어

스택
: 후입 선출 대기열 : 선입 선출

공식 다이어그램에서 직접보십시오.
여기에 사진 설명 삽입
두 개의 스택을 사용하고 스택 1은 새 데이터를 저장하는 데 사용되며 스택 2는 스택 1의 데이터를 뒤집어 선입 선출의 목적을 달성하는 데 사용됩니다. 특히 : appendTail시 스택 1에 직접 데이터 저장, deleteHead시 먼저 스택 2에 요소가 있는지 확인하고, 스택에 요소가 있으면 요소가 없으면 스택에 요소가 있는지 확인 스택 1에 요소가있는 경우 스택 2를 하나씩 팝하고로드 한 다음 스택 2를 다시 팝합니다. 스택 1에 요소가 없으면 대기열이 비어 있습니다.

암호:

class CQueue {
    
    
    Deque<Integer> stack1;
    Deque<Integer> stack2;
    
    public CQueue() {
    
     //构造函数
        stack1 = new LinkedList<Integer>();
        stack2 = new LinkedList<Integer>();
    }
    
    public void appendTail(int value) {
    
    
        stack1.push(value);
    }
    
    public int deleteHead() {
    
    
        if(!stack2.isEmpty()){
    
    
            int deleteItem = stack2.pop();
            return deleteItem;
        }else{
    
     // 若栈2为空
            while (!stack1.isEmpty()) {
    
     //若栈1不为空,则将栈1弹栈后的元素装进栈2
                stack2.push(stack1.pop());
            }
        } 
        if (stack2.isEmpty())  //若经过栈1的入栈后栈2还为空,则返回-1,说明队列为空
            return -1;
        else{
    
    
            int deleteItem = stack2.pop();
            return deleteItem;
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

피보나치 수열

문제 설명

함수를 작성하고 n을 입력 한 다음 피보나치 수열의 n 번째 항을 찾습니다 (예 : F (N)). 피보나치 수열의 정의는 다음과 같습니다.

F (0) = 0, F (1) = 1
F (N) = F (N-1) + F (N-2), 여기서 N> 1.
피보나치 수열은 0과 1로 시작하고 다음은 다음과 같습니다. 피보나치 수는 앞의 두 수를 더하여 얻습니다.

답은 모듈로 1e9 + 7 (1000000007)이어야합니다. 계산의 초기 결과가 1000000008이면 1을 반환하십시오.

문제 해결 아이디어

공식에 따라 직접 동적 프로그래밍을 사용하면 재귀가 시간 초과됩니다.

class Solution {
    
    
    public int fib(int n) {
    
    
    	if(n == 0 || n == 1) return n;
        int dp[] = new int[n+1];
        dp[0] = 0;
        dp[1] = 1;
        for(int i=2;i<=n;i++)
            dp[i] = (dp[i-1] + dp[i-2])%1000000007; //注意题目要求取模
        return dp[n];
    }
}

추천

출처blog.csdn.net/qq_43424037/article/details/114985321