Hangi rengi kullandığınızı takip etmek için bir yığın kullanarak soldan sağa doğru yürüyün. Ayrık bir harita yerine, veri kümenizdeki 10 sayıyı kesme noktası olarak kullanın.
Boş bir yığınla başlayıp start0 olarak ayarlayarak , sonuna kadar döngü yapalım:
- Yığın boşsa:
- İlk renkte veya daha sonra başlayan ilk rengi arayın
startve alt sıradaki tüm renkleri yığının üzerine itin. Düzleştirilmiş listenizde, o rengin başlangıcını işaretleyin.
- başka (Boş değilse):
- Daha yüksek dereceli renkler için veya daha sonra bir sonraki başlangıç noktasını bulun
start ve geçerli rengin sonunu bulun
- Bir sonraki renk önce başlarsa, onu ve yığına giden yolda başka bir şeyi itin. Geçerli rengin sonunu bunun başlangıcı olarak güncelleyin ve bu rengin başlangıcını düzleştirilmiş listeye ekleyin.
- Hiçbiri yoksa ve geçerli renk önce biterse,
start , bu rengin sonuna , yığından çıkarın ve bir sonraki en yüksek sıradaki rengi kontrol edin
- Bir
startsonraki rengin aralığındaysa, bu rengi şuradan başlayarak düzleştirilmiş listeye ekleyin:start .
- Yığın boşalırsa, döngüye devam edin (ilk madde işaret noktasına geri dönün).
Bu, örnek verileriniz göz önüne alındığında zihinsel bir çalışmadır:
# Initial data.
flattened = []
stack = []
start = 0
# Stack is empty. Look for the next starting point at 0 or later: "b", 0 - Push it and all lower levels onto stack
flattened = [ (b, 0, ?) ]
stack = [ r, b ]
start = 0
# End of "b" is 5.4, next higher-colored start is "g" at 2 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, ?) ]
stack = [ r, b, g ]
start = 2
# End of "g" is 12, next higher-colored start is "y" at 3.5 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, ?) ]
stack = [ r, b, g, y ]
start = 3.5
# End of "y" is 6.7, next higher-colored start is "o" at 6.7 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, ?) ]
stack = [ r, b, g, y, o ]
start = 6.7
# End of "o" is 10, and there is nothing starting at 12 or later in a higher color. Next off stack, "y", has already ended. Next off stack, "g", has not ended. Delimit and continue.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, ?) ]
stack = [ r, b, g ]
start = 10
# End of "g" is 12, there is nothing starting at 12 or later in a higher color. Next off stack, "b", is out of range (already ended). Next off stack, "r", is out of range (not started). Mark end of current color:
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12) ]
stack = []
start = 12
# Stack is empty. Look for the next starting point at 12 or later: "r", 12.5 - Push onto stack
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, ?) ]
stack = [ r ]
start = 12
# End of "r" is 13.8, and there is nothing starting at 12 or higher in a higher color. Mark end and pop off stack.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, 13.8) ]
stack = []
start = 13.8
# Stack is empty and nothing is past 13.8 - We're done.