JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #162. การนำสแต็กไปใช้โดยใช้คิว วิธีการเรียนคณิ...

คอฟฟี่เบรค #162. การนำสแต็กไปใช้โดยใช้คิว วิธีการเรียนคณิตศาสตร์ Java

เผยแพร่ในกลุ่ม

การใช้สแต็กโดยใช้คิว

ที่มา: Hackernoon เนื้อหาของบทความนี้มีไว้สำหรับการแก้ปัญหาการนำสแต็กไปใช้โดยใช้เพียงสองคิวเท่านั้น คอฟฟี่เบรค #162.  การนำสแต็กไปใช้โดยใช้คิว  วิธีการเรียนคณิตศาสตร์ Java Math - 1เรามีปัญหากับ Leetcode :

ใช้สแต็กเข้าก่อนออกก่อน (LIFO) โดยใช้เพียงสองคิวเท่านั้น สแต็กที่นำไปใช้จะต้องรองรับฟังก์ชันทั้งหมดของสแต็กปกติ ( push , top , popและEmpty )

ใช้คลาส MyStack:

  • ถือเป็นโมฆะผลักดัน (int x)ผลักองค์ประกอบ x ไปที่ด้านบนของสแต็ก

  • int pop()ลบองค์ประกอบที่อยู่ด้านบนของสแต็กแล้วส่งคืน

  • int top()ส่งคืนองค์ประกอบที่ด้านบนของสแต็ก

  • boolean Empty()คืนค่าเป็นจริง หากสแต็กว่างเปล่า หากเป็นเท็จ ให้ คืน ค่า เป็นเท็จ

รายละเอียดเพิ่มเติม:

  • คุณควรใช้การดำเนินการคิวมาตรฐานเท่านั้น ซึ่งหมายความว่าอนุญาตให้ ใช้ เฉพาะ push to back , peek/pop จาก front , sizeและอนุญาตให้ดำเนินการว่างได้

  • ขึ้นอยู่กับภาษาการเขียนโปรแกรมของคุณ คิวอาจไม่รองรับโดยกำเนิด แต่คุณสามารถจำลองคิวได้โดยใช้รายการหรือ deque (คิวคู่) หากคุณใช้การดำเนินการคิวมาตรฐานเท่านั้น

ตัวอย่างที่ 1:

ป้อนข้อมูล

["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]

เอาท์พุต

[โมฆะ โมฆะ โมฆะ 2, 2 เท็จ]

คำอธิบาย

MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // возвращает 2
myStack.pop(); // возвращает 2
myStack.empty(); // возвращает False

การแก้ปัญหา

ตัวเลือกแรก

ในแนวทางแรก เราจะใช้หน่วยความจำเพิ่มเติม:
static class MyStack {
  private Queue<Integer> current;
  private Queue<Integer> tmp;

  public MyStack() {
    current = new ArrayDeque<>();
    tmp = new ArrayDeque<>();
  }
เราจำเป็นต้องมีคิวเพิ่มเติมสำหรับโซลูชันนี้ เริ่มต้นด้วยการผลักดัน สำหรับ การดำเนินการ พุชเราเพียงเพิ่มองค์ประกอบใหม่ให้กับคิวปัจจุบันของเรา
public void push(int x) {
  current.add(x);
}
เคล็ดลับหลักที่นี่คือวิธีป๊อป ที่ นี่ เราใส่องค์ประกอบทั้งหมดยกเว้นองค์ประกอบสุดท้ายลงใน คิว tmp และตอนนี้องค์ประกอบสุดท้ายในคิวก็กลายเป็นองค์ประกอบแรกที่ส่งไป
public int pop() {
  if (current.isEmpty()){
    return -1;
  }
  int size = current.size();
  for (int i = 0; i < size - 1; i ++){
    tmp.add(current.poll());
  }
  int ret = current.poll();
  current = tmp;
  return ret;
}
แล้ว วิธีการ ด้านบน ล่ะ ? วิธีนี้คล้ายกับpop :
public int top() {
  if (current.isEmpty()){
    return -1;
  }
  int size = current.size();
  for (int i = 0; i < size - 1; i ++){
    tmp.add(current.poll());
  }
  int ret = current.peek();
  tmp.add(current.poll());
  current = tmp;
  return ret;
}
และสำหรับ เมธอด ว่าง อันสุดท้าย เราควรตรวจสอบคิวปัจจุบัน:
public boolean empty() {
  return current.isEmpty();
}

วิธีแก้ปัญหาที่สอง

ในตัวเลือกนี้ เราจะไม่ใช้หน่วยความจำเพิ่มเติม:
static class MyStack {

  private Queue<Integer> current;

  public MyStack2() {
    current = new ArrayDeque<>();
  }
}
แนวคิดหลักที่นี่คือวิธีการพุช เราเพิ่มองค์ประกอบปัจจุบันแล้วย้ายองค์ประกอบก่อนหน้าองค์ประกอบปัจจุบันไปยังจุดสิ้นสุดของคิว ตัวอย่างเช่น หากเรามีคิวที่มีองค์ประกอบ [2,1] เราจะใช้การกด 3 - และรับคิว [3,2,1] จากนั้น [1,3,2], [2,1,3] และ .. และทั้งหมด.
public void push(int x) {
  current.add(x);
  int size = current.size();

  for (int i = 0; i < size-1; i ++){
    current.add(current.poll());
  }
}
ที่นี่เรามีองค์ประกอบที่ถูกต้องและจุดเริ่มต้นของคิวสำหรับวิธีอื่นๆ ทั้งหมดแล้ว
public int pop() {
  return current.poll();
}

public int top() {
  return current.peek();
}

public boolean empty() {
  return current.isEmpty();
}

วิธีการเรียนคณิตศาสตร์ Java

ที่มา: สื่อ ในโพสต์นี้ คุณจะได้เรียนรู้เกี่ยวกับความสามารถและขอบเขตของคลาส Java Math คอฟฟี่เบรค #162.  การนำสแต็กไปใช้โดยใช้คิว  วิธีการเรียนคณิตศาสตร์ Java - 2ส่วนหนึ่งของ แพ็คเกจ Java.lang.Mathในภาษา Java คือคลาสMath คลาสนี้ให้วิธีการที่กำหนดไว้ล่วงหน้าบางอย่างแก่เรา เช่นmin , max , sqrtและอื่น ๆ ด้านล่างนี้เป็นตัวอย่างวิธีการบางอย่างจาก ชั้นเรียน คณิตศาสตร์ที่เราสามารถใช้ในการทำงานประจำวันของเรา 1. เมธอด max()ส่งคืนจำนวนที่มากกว่าที่ส่งผ่านในพารามิเตอร์:
System.out.println(Math.max(5,3));
OUTPUT: 5
2. เมธอด sqrt()จะแสดงรากที่สองของจำนวนที่ส่งเป็นอาร์กิวเมนต์:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. วิธี การสุ่ม ()ส่งกลับตัวเลขสุ่มในช่วงตั้งแต่ 0 ถึง 1
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. วิธี abs()ส่งกลับค่าบวกสัมบูรณ์ของจำนวนลบใดๆ ตัวอย่างเช่น ถ้าเราส่งค่าเป็น 0 ผลลัพธ์ก็จะคืนค่าเป็น 0
System.out.println(Math.abs(-4));
OUTPUT: 4
System.out.println(Math.abs(4));
OUTPUT: 4
System.out.println(Math.abs(0));
OUTPUT: 0
5. เมธอดfloor()ส่งกลับค่าสองเท่าที่น้อยกว่าหรือเท่ากับอาร์กิวเมนต์และเท่ากับจำนวนเต็มทางคณิตศาสตร์ที่ใกล้ที่สุด
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION