Stack - เว็บไซต์บุคลากรภาควิชาวิทยาการคอมพิวเตอร์
Download
Report
Transcript Stack - เว็บไซต์บุคลากรภาควิชาวิทยาการคอมพิวเตอร์
Stack
Stack
คุณลักษณะของสแตก
o การนาข้ อมูลเข้ าและออกจากสแตกจะกระทาที่ปลายข้ างเดียว
เท่านัน้
o การทางานของสแตกจะมีลกั ษณะแบบ เข้ าหลัง ออกก่ อน
(LIFO: Last In, First Out)
o ตัวอย่างการทางานแบบ LIFO เช่น การวางจานซ้ อนกัน
Stack
ประโยชน์ ของสแตก
o เพื่อแปลงนิพจน์ทางคณิตศาสตร์
o การจัดลาดับการทางานแบบ recursive หรื อการเรี ยกใช้ ฟังก์ชนั
o เป็ นกลไกสาคัญในการทางานของ compiler เช่น การตรวจสอบ
เครื่ องหมาย { } ในภาษาซี หรื อการตรวจสอบเครื่ องหมายวงเล็บ
Stack
การสร้ างสแตก
o สามารถใช้ อาเรย์ หรื อ Linked List แทนได้
o มีตวั ชี ้ 1 ตัวสาหรับชี ้ที่สมาชิกตัวบนสุดของสแตก สมมติให้ เป็ น
TOP
o กรณีสแตกว่าง กาหนดให้ คา่ TOP = 0
o กรณี TOP=N เมื่อ N คือขนาดของสแตก แสดงว่าสแตกเต็ม
Empty stack
Full stack
TOP=N
TOP=0
A
A
A
D
C
B
A
Stack
Operation ของสแตก
o การเพิ่มข้ อมูลลงในสแตก (PUSH)
o การดึงข้ อมูลออกจากสแตก (POP)
Stack
การเพิ่มข้ อมูลลงในสแตก (PUSH)
o ในการ PUSH ข้ อมูลต้ องตรวจสอบก่อนว่าสแตกเต็มหรื อไม่ โดย
ใช้ เงื่อนไข TOP = N หรื อไม่ เมื่อ N คือขนาดของสแตก
o หาก TOP = N แสดงว่าสแตกเต็ม
o หากสแตกเต็มจะไม่สามารถนาข้ อมูลเข้ าไปในสแตกได้ อีก
Stack
PUSH ALGORITHM
Push(stack,max,top,item)
if(max=top)
write “Full Stack”
else
top ← top + 1
stack[top] = item
หมายเหตุ:
stack คือ ชื่ออาเรย์ที่ใช้ เก็บข้ อมูลในสแตก
max คือ ขนาดของสแตก
top ใช้ เก็บตาแหน่งบนสุดของสแตก
Item แทนข้ อมูลที่ต้องการ push ลงในสแตก
Stack
ตัวอย่ าง PUSH
Empty stack
Push(A)
Push(B)
Push(C)
TOP=3
TOP=2
TOP=1
TOP=0
A
Push(D)
TOP=4
D
C
B
B
A
A
Push(E)
TOP=4
D
C
C
B
B
A
A
Error:Full Stack
Stack
การดึงข้ อมูลออกจากสแตก (POP)
o ในการ POP ข้ อมูลต้ องตรวจสอบก่อนว่ามีข้อมูลอยูใ่ นสแตก
หรื อไม่ โดยใช้ เงื่อนไข TOP = 0
o หาก TOP = 0 แสดงว่าสแตกว่างเปล่า
o หากสแตกว่างเปล่าจะไม่สามารถดึงข้ อมูลออกจากสแตกได้
Stack
POP ALGORITHM
Pop(top)
if(top=0)
write “Empty Stack”
else
top ← top - 1
หมายเหตุ:
top ใช้ เก็บตาแหน่งบนสุดของสแตก
Stack
ตัวอย่ าง POP
Pop
TOP=4
Pop
Pop
D
TOP=3
C
C
B
B
A
A
Pop
Pop
TOP=2
B
A
Pop
Error:
Empty Stack
TOP=1
A
TOP=0
TOP=0
การใช้ สแตก เพือ่ แปลงเลขฐานสิ บเป็ นเลขฐานสอง
Algorithm
1. loop (number > 0)
1.1 b = number modulo 2
1.2 push (stack,b)
1.3 number = number / 2
2. loop (not empty(stack))
2.1 pop(stack)
1 0 1
ตัวอย่ าง: 11 ---> 1011
pop
1
0
1
1
0
1
1
1
1
top
top
top
top
1
stack
stack
stack
stack
1
Parenthesis matching
Algorithm
1. loop (more data)
1.1 If character is ‘(‘
1.1.1 push(stack, character)
1.2 else if character is ‘)’
1.2.1 if empty (stack) then error
1.2.2 else pop(stack)
2. if not empty(stack)
2.1 error
ตัวอย่ าง: ((A + B) / C)
push(‘(’)
push(‘(’)
top
top
(
stack
pop
pop
(
(
stack
top
(
stack
top
stack
Parenthesis matching
Algorithm
1. loop (more data)
1.1 If character is ‘(‘
1.1.1 push(stack, character)
1.2 else if character is ‘)’
1.2.1 if empty (stack) then error
1.2.2 else pop(stack)
2. if not empty(stack)
2.1 error
ตัวอย่ าง: (A + B) + C)
push(‘(’)
pop
empty stack
error
top
(
stack
top
stack
stack
การใช้ สแตก เพือ่ แปลงนิพจน์ ทางคณิตศาสตร์
รู ปแบบนิพจน์ ทางคณิตศาสตร์
o Infix : A + B * C - D / E
o Postfix : A B C * + D E / -
Operators priority
o
o
o
o
priority 3 : + priority 2 : * /
priority 1 : ^
priority 0 : (
น้ อย
มาก
Infix to Postfix Transformation
Algorithm infix2postfix
1. CreateStack (s)
2. Loop (for each character in infix)
2.1 if (character = ‘(‘)
2.1.1 pushStack (s, character)
2.2 elseif (character = ‘)’)
2.2.1 popStack (s, character)
2.2.2 loop (character ≠ ‘(‘)
1. print character
2. popStack (s, character)
Infix to Postfix Transformation
Algorithm infix2postfix (cont.)
2.3 elseif (character = ‘*’, ‘/’, ‘+’, ‘-’, ‘^’)
2.3.1 stackTop (s, toptoken)
2.3.2 loop (not emptyStack (s) and
priority(character) <= priority(toptoken))
1. popStack (s, tokenout)
2. print tokenout
3. stackTop (s, toptoken)
2.3.3 pushStack (s, character)
2.4 else
2.4.1 print character
Infix to Postfix Transformation
Algorithm infix2postfix (cont.)
3. Loop (not emptyStack (s))
3.1 popStack (s, character)
3.2 print character
4. end
Infix to Postfix Transformation
ABC
Infix : A + B * C
Postfix : A B C * +
*
+
Infix to Postfix Transformation
Infix : A + B * C - D / E
Postfix : A B C * + D E / -
A B C *
* /
+ -
+
D E
/ -
Algorithm Postfix Evaluation
1.
createStack (s)
2. Loop (for each character)
2.1 if character is operand
2.1.1 pushStack (s, character)
2.2 else
2.2.1 popStack (s, oper2)
2.2.2 popStack (s, oper1)
2.2.3 operator character
2.2.4 value calculate (oper1, operator, oper2)
2.2.5 pushStack (s, value)
3. popStack (s, result)
4. end
Postfix Evaluation
ABC+*
2 4 6+*
6
4
2
+
10
*
20
Exercise
Convert Infix to Postfix
1. A+B*C-D+E
2. (A+B)*C-(D+E)
3. A*(B-C)/D+E*F
4. 3*(1+7)/2
จัดทำโดย อ.ดำรำรัตน์ แซ่ล้ ี ภำควิชำวิทยำกำรคอมพิวเตอร์ คณะวิทยำศำสตร์
มหำวิทยำลัยสงขลำนคริ นทร์
24/96