ไดอะแกรมสถานะสแต็กแสดงวิธีที่ค่าบนหนึ่งสแต็กถูกเปลี่ยนเป็นอื่น ตัวอย่างเช่นนี่คือแผนภาพสถานะสแต็ก:
3 0 2 1 0
ซึ่งหมายความว่ามีสแต็กเริ่มแรกประกอบด้วย 3 ค่า ( 3
ส่วน) ค่าเหล่านี้ถูกจัดทำดัชนีจาก 0 ถึง 2 โดยมี 0 ที่ด้านบน:2 1 0
ที่ด้านบน: ส่วนถัดไป0 2 1 0
อธิบายถึงสถานะสุดท้ายของสแต็ก: ค่าที่อยู่ด้านบนสุดของสแต็กถูกคัดลอกไปที่ด้านหลังเช่นกัน
การแปลงเหล่านี้เกิดขึ้นบนสแต็กที่สนับสนุนหลายชนิดข้อมูล:
- ชนิด "value" ซึ่งเป็นค่าเริ่มต้นของสแต็ก นี่อาจเป็นสตริงจำนวนเต็ม ฯลฯ แต่ไม่จำเป็นต้องทราบค่าของมัน
- ชนิด "รายการ" ซึ่งเป็นรายการที่มีค่าของชนิดข้อมูลใด ๆ
เพื่อจำลองการเปลี่ยนแปลงนี้อนุญาตการดำเนินการต่อไปนี้:
S
: สลับค่าสองค่าที่ด้านบนสุดของสแต็ก:2 1 0
→2 0 1
D
: ทำซ้ำค่าที่ด้านบนของสแต็ก:1 0
→1 0 0
R
: ลบค่าสูงสุดบนสแต็ก2 1 0
→2 1
L
: เปลี่ยนค่าสูงสุดเป็นรายการองค์ประกอบเดียวที่มีค่านั้น:2 1 0
→2 1 (0)
C
: เชื่อมต่อสองรายการแรกสุดในสแต็ก:2 (1) (0)
→2 (1 0)
U
: วางค่าทั้งหมดจากรายการลงในสแต็ก:2 (1 0)
→2 1 0
สิ่งเหล่านี้เทียบเท่ากับคำสั่งUnderload~ : ! a * ^
โดยที่ไม่มีการใช้คำสั่งอื่น
S
, D
, R
และL
สามารถใช้กับค่าใด ๆ ที่ด้านบนของสแต็ค แต่C
และU
ต้องมีรายชื่ออยู่ด้านบนของสแต็คเพื่อฟังก์ชั่น ส่งที่มีลำดับความพยายามที่จะสร้าง preform การดำเนินงานที่ไม่ถูกต้อง (เช่นD
ในกองว่างเปล่าหรือU
ในที่ไม่ใช่รายการ) คือผิดและจะต้องได้รับการลงโทษคงที่
เพื่อแก้ไขไดอะแกรมสถานะสแต็กค้นหาลำดับของคำสั่งที่จะเปลี่ยนสถานะสแต็กเริ่มต้นให้เป็นสถานะใหม่ได้อย่างถูกต้อง ตัวอย่างเช่นทางออกหนึ่ง3: 0 2 1 0
คือLSLCSLCULSLCLSLDCSC USLCU
:
2 1 0
L 2 1 (0)
S 2 (0) 1
L 2 (0) (1)
C 2 (0 1)
S (0 1) 2
L (0 1) (2)
C (0 1 2)
U 0 1 2
L 0 1 (2)
S 0 (2) 1
L 0 (2) (1)
C 0 (2 1)
L 0 ((2 1))
S ((2 1)) 0
L ((2 1)) (0)
D ((2 1)) (0) (0)
C ((2 1)) (0 0)
S (0 0) ((2 1))
C (0 0 (2 1))
U 0 0 (2 1)
S 0 (2 1) 0
L 0 (2 1) (0)
C 0 (2 1 0)
U 0 2 1 0
งานของคุณคือการเขียนโปรแกรมที่ใช้แผนภาพสถานะสแต็กและส่งออกโซลูชั่น
กรณีทดสอบ
2 1 0 ->
3 2 0 -> SR
9 -> RRRRRRRRR
2 0 1 0 -> LSLCDCUR
2 0 1 1 -> SD
6 2 -> RRSRSRSR
5 0 1 2 3 4 -> LSLCSLCSLCSLCU
4 2 0 1 3 2 -> LSLCSLSCSLCULSLSCSLSCLSLDCSCUSLCU
นี่คือรหัสกอล์ฟดังนั้นคำตอบที่ถูกต้องสั้นที่สุด (เป็นไบต์) ชนะ
C
รายการความจำเป็นในตำแหน่งบนสุดและครั้งที่สองของสแต็ค? หรือองค์ประกอบในตำแหน่งที่สองสามารถเพิ่มลงในรายการด้านบน?
C
ต้องการรายการทั้งสองตำแหน่ง มันไม่สมเหตุสมผลที่จะต่อค่าและรายการเข้าด้วยกัน