JavaRush /Java Blog /Random-TL /Coffee break #162. Pagpapatupad ng isang stack gamit ang ...

Coffee break #162. Pagpapatupad ng isang stack gamit ang isang queue. Mga pamamaraan ng klase ng Java Math

Nai-publish sa grupo

Pagpapatupad ng stack gamit ang isang queue

Pinagmulan: Hackernoon Ang nilalaman ng artikulong ito ay nakatuon sa paglutas ng problema ng pagpapatupad ng isang stack gamit lamang ang dalawang pila. Coffee break #162.  Pagpapatupad ng isang stack gamit ang isang queue.  Mga pamamaraan ng klase ng Java Math - 1Mayroon kaming problema sa Leetcode :

Magpatupad ng last-in-first-out (LIFO) stack gamit lang ang dalawang queue. Dapat suportahan ng ipinatupad na stack ang lahat ng mga function ng isang regular na stack ( push , top , pop , at empty ).

Ipatupad ang klase ng MyStack:

  • void push(int x) Itulak ang elemento x sa tuktok ng stack.

  • int pop() Tinatanggal ang elemento sa tuktok ng stack at ibinabalik ito.

  • int top() Ibinabalik ang elemento sa tuktok ng stack.

  • boolean empty() Nagbabalik ng true kung walang laman ang stack, false kung hindi .

Mga karagdagang detalye:

  • Dapat mo lang gamitin ang mga karaniwang operasyon ng queue, na nangangahulugang push to back lang , silip/pop mula sa harap , laki , at walang laman na operasyon ang pinapayagan .

  • Depende sa iyong programming language, maaaring hindi native na suportado ang queue. Ngunit maaari mong gayahin ang isang queue gamit ang isang listahan o isang deque (double queue) kung gumagamit ka lamang ng mga karaniwang operasyon ng queue.

Halimbawa 1:

Input

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

Output

[null, null, null, 2, 2, false]

Paliwanag

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

Ang solusyon sa problema

Unang pagpipilian

Sa unang solusyon ay gagamit kami ng karagdagang memorya:
static class MyStack {
  private Queue<Integer> current;
  private Queue<Integer> tmp;

  public MyStack() {
    current = new ArrayDeque<>();
    tmp = new ArrayDeque<>();
  }
Kailangan namin ng karagdagang pila para sa solusyon na ito. Magsimula tayo sa push . Para sa isang push operation , nagdaragdag lang kami ng bagong elemento sa aming kasalukuyang pila.
public void push(int x) {
  current.add(x);
}
Ang pangunahing lansihin dito ay ang pop method . Dito namin inilalagay ang lahat ng elemento maliban sa huli sa tmp queue . At ngayon ang huling elemento sa pila ay nagiging unang elementong ipinadala.
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;
}
Paano ang tungkol sa nangungunang pamamaraan ? Ang pamamaraang ito ay katulad ng 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;
}
At para sa huling walang laman na paraan , dapat lang nating suriin ang kasalukuyang pila:
public boolean empty() {
  return current.isEmpty();
}

Pangalawang solusyon

Sa opsyong ito hindi kami gagamit ng karagdagang memorya:
static class MyStack {

  private Queue<Integer> current;

  public MyStack2() {
    current = new ArrayDeque<>();
  }
}
Ang pangunahing ideya dito ay ang paraan ng pagtulak . Idinaragdag namin ang kasalukuyang elemento at pagkatapos ay ilipat ang mga elemento bago ang kasalukuyang elemento sa dulo ng pila. Halimbawa, kung mayroon kaming pila na may mga elemento [2,1], ginagamit namin ang push 3 - at makakuha ng queue [3,2,1], pagkatapos ay [1,3,2], [2,1,3] at. .. at lahat.
public void push(int x) {
  current.add(x);
  int size = current.size();

  for (int i = 0; i < size-1; i ++){
    current.add(current.poll());
  }
}
Narito mayroon na tayong tamang elemento at simula ng pila para sa lahat ng iba pang pamamaraan.
public int pop() {
  return current.poll();
}

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

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

Mga pamamaraan ng klase ng Java Math

Source: Medium Sa post na ito, malalaman mo ang tungkol sa mga kakayahan at saklaw ng klase ng Java Math. Coffee break #162.  Pagpapatupad ng isang stack gamit ang isang queue.  Java Math Class Methods - 2Bahagi ng Java.lang.Math package sa Java language ang Math class . Ang klase na ito ay nagbibigay sa amin ng ilang paunang natukoy na mga pamamaraan tulad ng min , max , sqrt at iba pa. Nasa ibaba ang mga halimbawa ng ilang pamamaraan mula sa klase sa Math na magagamit natin sa ating pang-araw-araw na gawain. 1. Ibinabalik ng max() na pamamaraan ang mas malaking numerong ipinasa sa parameter:
System.out.println(Math.max(5,3));
OUTPUT: 5
2. Ang sqrt() method ay magpapakita sa amin ng square root ng numerong ipinasa bilang argumento:
System.out.println(Math.sqrt(4));
OUTPUT: 2.0
3. Ang random() na paraan ay nagbabalik ng random na numero sa hanay mula 0 hanggang 1.
System.out.println(Math.random());
OUTPUT: 0.8685304957692445
4. Ang abs() na pamamaraan ay nagbabalik ng ganap na positibong halaga ng anumang negatibong numero. Halimbawa, kung ipapasa natin ito bilang 0, babalik ito ng 0 bilang resulta.
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. Ang floor() method ay nagbabalik ng double value na mas mababa sa o katumbas ng argument at katumbas ng pinakamalapit na mathematical integer.
System.out.println(Math.floor(-1.2));
OUTPUT: -2.0
System.out.println(Math.floor(1.2));
OUTPUT: 2.0
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION