スタック

43086 ワード

2.スタック


スタックは?


:後入先出、後入先出
:スタックには2つのエンドポイント(top、base)があり、最近はtopで、最も古いのはbaseです.

2)スタックの作成


:スタックを表すクラスを直接作成できます.

(1)スタック実装に必要な方法


  • push(要素):スタックの上部に新しい要素を追加します.

  • pop():スタックの上部要素を返し、削除します.

  • peek():スタックの上部要素を返しますが、要素は削除されません.(参考役)

  • isEmpty():スタックに要素が1つもない場合はtrueを返し、スタックサイズ>0の場合はfalseを返します.

  • clear():スタック内のすべての要素を削除します.

  • size():スタック内の要素の数を返します.
  • (2) push()


  • push()はスタックに新しい要素を追加する方法です.

  • ただし、スタックの上部に魔要素を入れることができます.
  • this.push = function(element){
      items.push(element);
    }

    (3) pop()


    最初に最後に追加された要素
  • を削除します.
  • this.pop = function(){
      return items.pop();
    }

    (4) peek()

  • スタックに最後に追加された要素を返します.
  • this.peek = function(){
      return items[item.length-1];
    }

    (5) isEmpty()

  • スタックは空でtrueであり、スタックの1つはfalseである.
  • this.isEmpty = function(){
      return items.length == 0;
    }
    
    <br/>
    
    ### (6) size()
    
    - 스택과 같으 컬랙션에서는 length 대신 size()라는 용어를 쓴다.
    
    ```javascript
    this.size = function(){
      return items.length;
    }

    (7) clear()

  • スタック内のすべての要素を削除する役割を果たします.
  • this.clear = function(){
      items = [];
    }

    3)stack類、一目瞭然

    function stack(){
    
      var items = [];
      
      this.push = function(e){
        items.push(e);
      }
      this.pop = function(){
        returm items.pop();
      }
      this.peek = function(){
        return items[items.length-1];
      }
      this.isEmpty = function(){
        return items.length == 0;
      }
      this.size = function(){
        return items.length;
      }
      this.clear = function(){
        items = [];
      }
      this.print = function(){
        console.log(items.toString());
      }
    
    }
    

    4)スタックの問題を解く


    (1)10828号、工作室

    // 명령입력받기
    var input = prompt('명령의 수를 입력하시오');
    // 스택 저장소
    var box = []
    
    // 명령수만큼 반복
    while(input > 0){
        // 명령입력받기
        var text = prompt('명령하시오');
        stackFunc(text);
        input = input-1;
    }
    
    
    // 함수
    // push X일시 box에 X가 추가 
    function stackFunc(text){
        // 받은 text에 push라는 말이 있다면?
        // 띄어쓰기 단위로 잘라서 -> 마지막 인덱스만 쟁취(형변환)
        if(text.includes('push')){
            splitText = text.split(' ');
            box.push(parseInt(splitText[1])) 
        }
        else if(text.includes('pop')){
            let pops = box.pop();
            pops === undefined ? alert(-1) : alert(pops)
        }
        // size: 스택에 들어있는 정수의 개수를 출력한다.
        else if(text.includes('size')){
            alert(box.length);
        }
        //empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
        else if(text.includes('empty')){
            box.length === 0 ? alert(1) : alert(0)
        }
        //top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
        else if(text.includes('top')){
            box.length === 0 ? alert(-1) : alert(box[box.length-1])
        }
    
    }

    (2) 10773、ゼロ

    // 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.
    // 재민이가 최종적으로 적어 낸 수의 합을 출력한다. 
    // 1. 입력할 숫자의 개수를 받음
    var input = prompt('재민아, 입력할 숫자의 개수를 말해죠!')
    var box = []
    var sum = 0
    while(input > 0){
        // 2. 수를 입력받는다.
        var nums = parseInt(prompt('수를 말해주세요'))
    
        // 3. 만약 입력받은 수가 0이면 -> pop() | 아니면 stack에 넣음
        nums == 0 ? box.pop() : box.push(nums)
    
        input = input - 1;
    }
    
    for(var value of box){
        sum = sum + parseInt(value) 
    }
    alert(sum);
    
    // 4. 마지막에 stack의 합을 출력

    (3) 9012、かっこ

    // 4. 스택배열(box)에 arr원소를 하나씩 push
    function vps(arr){
        let box = []                        
        for(let value of arr){
            // 4-1. box가 비어있거나, box의 끝값이 ")"이고 push값이 "(" 그냥 push
            if(box.length == 0 || value == "(" && box[box.length-1] == ")"){
                box.push(value);            
                alert("box:" + box, "push:" + value)        //괄호흐름확인
            }
    
            // 4-2. box안에 있는 문자가 "("이고 push값이 ")"이면 -> (,)이므로 box를 pop
            else if(value == ")" && box[box.length-1] == "("){
                box.pop();                  
                alert("box:" + box, "push:" + value)
            }
            //4-3. 그 이외는 push
            else{
                box.push(value);          
                alert("box:" + box, "push:" + value)
            } 
        }
        (box.length == 0) ? result.push('YES') : result.push('NO')
    }
    
    
    var input = prompt('입력할 개수')              //1. 입력할 개수
    var result = [];
    
    while(input > 0){
        sample = prompt('괄호조합을 입력받음');      //2. 괄호조합을 입력
        let arr = sample.split('');            // 3. 괄호조합을 배열로 변경
    
        vps(arr);
        input = input - 1;
    }
    alert(result)                        
    
    

    (4)4949,是巴伦斯的世界


    正規表現で一部の文字、数字などを除外する

  • 正規表現
  • function onlyNumber(str) {
    
        var pattern_special = /[~!@\#$%<>^&*\()\-=+_\’]/gi,
            pattern_kor = /[ㄱ-ㅎ가-힣]/g,
            pattern_eng = /[A-za-z]/g;
    
        if (pattern_special.test(str) || pattern_kor.test(str) || pattern_eng.test(str)) {
            return str.replace(/[^0-9]/g, "");
        } else {
            return false;
        }
    
    }
    [オプション]:g(すべてチェック)、i(すべての大文字と小文字をチェック)
    [数字のみ抽出]:/[a-z]/gi
    [文字のみ抽出]:/[1-9]/gi
    [空白を除去]:str 1.replace(/(\s*)/g, "")
  • string.replace( 'string1', 'string2' )
  • :stringでstring 1を検索し、string 2に置き換えます.
    var result = []
    function onlySpecial(str) {  
        let pattern_eng = /[A-za-z]/g
    
        if (pattern_eng.test(str)) {                        
            let test1 = str.replace(/[a-z]/gi, "");        
            let test2 = test1.replace(/(\s*)/g, "");      
            // /[a-z]/gi
            
            alert(test2.split(''))
            return test2.split('')
        } else {
            return false;
        }
    
    }
    
    
    // 3. (), []를 판단하는 함수 작성
    function vps(arr){
        let box = []                        
        for(let value of arr){
            
            // 4-1. box가 비어있거나, box의 끝값이 ")"이고 push값이 "(" 그냥 push
            if(box.length == 0 || (value == "(" && box[box.length-1] == ")") || (value == "[" && box[box.length-1] == "]")){
                box.push(value);            
                alert("box:" + box, "push:" + value)        //괄호흐름확인
            }
    
            // 4-2. box안에 있는 문자가 "("이고 push값이 ")"이면 -> (,)이므로 box를 pop
            else if((value == ")" && box[box.length-1] == "(") || (value == "]" && box[box.length-1] == "[")){
                box.pop();                  
                alert("box:" + box, "push:" + value)
            }
            //4-3. 그 이외는 push
            else{
                box.push(value);          
                alert("box:" + box, "push:" + value)
            } 
        }
        (box.length == 1) ? result.push('YES') : result.push('NO')
    }
    
    
    
    
    // 1. 입력받는다.
    // 2. 입력의 종료조건으로 맨 마지막에 점 하나(".")가 들어온다.
    while(true){
        let input = prompt('문자를 입력하시오');
        if(input == '.'){
            break;
        }else{
            let specText = onlySpecial(input);          //오직, 괄호만 남은 배열
            try {
                vps(specText)
            } catch (TypeError) {                       //첫글자에 띄우고, 정규식 이후 배열에 괄호가 없는 경우 때 에러 " ."
                result.push('YES');    
            }
        }
    }
    alert(result)