82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
package next_greater_element
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
* IMPORTS
|
|
* ---------------------------------------------------------------- */
|
|
|
|
import (
|
|
"ads/internal/core/logging"
|
|
"ads/internal/core/metrics"
|
|
"ads/pkg/data_structures/stacks"
|
|
)
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
* GLOBAL VARIABLES/CONSTANTS
|
|
* ---------------------------------------------------------------- */
|
|
|
|
//
|
|
|
|
/* ---------------------------------------------------------------- *
|
|
* ALGORITHM next greater element
|
|
* ---------------------------------------------------------------- */
|
|
|
|
/*
|
|
Inputs: L = Liste von Zahlen.
|
|
|
|
Outputs: Liste von Paaren von Elementen und ihrem nächsten größeren Element
|
|
*/
|
|
func NextGreaterElement(L []int) [][2]int {
|
|
output := [][2]int{}
|
|
|
|
S := stacks.CREATE()
|
|
S.INIT()
|
|
|
|
for i := 0; i < len(L); i++ {
|
|
logging.Debug("Stack S | %v", S)
|
|
logging.Debug("Nächstes List-Element L[%v] = %v betrachten", i, L[i])
|
|
nextElement := L[i]
|
|
|
|
logging.Debug("Alle top Elemente vom Stack, die < nextElement sind, mit L[i] paaren")
|
|
// Führe aus, bis top Element >= nextElement oder Stack leer ist.
|
|
for !S.EMPTY() { // ACHTUNG: schreibe 'while' im Pseudocode, denn dies ist eine while-Schleife in golang
|
|
element := S.TOP()
|
|
if element < nextElement {
|
|
// falls top Element < next Element, zum Output hinzufügen und vom Stack entfernen
|
|
logging.Debug("Stack S | %v; top Element < nextElement; ==> pop und Paar zum Output hinzufügen", S)
|
|
output = append(output, [2]int{element, nextElement})
|
|
S.POP()
|
|
metrics.AddMovesCost()
|
|
logging.Debug("Stack S | %v", S)
|
|
} else if element > nextElement {
|
|
// falls top Element > next Element, auf Stack lassen und Schleife abbrechen.
|
|
break
|
|
} else {
|
|
// falls top Element == next Element, vom Stack entfernen und Schleife abbrechen.
|
|
S.POP()
|
|
metrics.AddMovesCost()
|
|
break
|
|
}
|
|
}
|
|
|
|
logging.Debug("L[%v] auf Stack legen", i)
|
|
S.PUSH(nextElement)
|
|
metrics.AddMovesCost()
|
|
}
|
|
|
|
logging.Debug("Stack S | %v", S)
|
|
|
|
// was übrig bleibt hat kein größeres Element
|
|
logging.Debug("Alles übrige auf Stack hat kein nächstes größeres Element")
|
|
for !S.EMPTY() { // ACHTUNG: schreibe 'while' im Pseudocode, denn dies ist eine while-Schleife in golang
|
|
logging.Debug("Stack S | %v", S)
|
|
element := S.TOP()
|
|
output = append(output, [2]int{element, -1})
|
|
S.POP()
|
|
metrics.AddMovesCost()
|
|
}
|
|
|
|
logging.Debug("Stack S | %v", S)
|
|
|
|
return output
|
|
}
|