スタック
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()
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, "")
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)
Reference
この問題について(スタック), 我々は、より多くの情報をここで見つけました https://velog.io/@gicomong/스택テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol