โครงสร้างข้อมูลแบบ Stack

Download Report

Transcript โครงสร้างข้อมูลแบบ Stack

โครงสร ้างข้อมู ลแบบ
Stack
Data Structure
Department of Computer Science
ลักษณะของโครงสร ้างข้อมู ลแบบ
Stack
่ บใน Stack จะเก็บในลักษณะ
• ข ้อมูลทีเก็
วางทับกัน เช่นเดียวกับการวางจานเรียง
่ ่
ซ ้อนกัน ข ้อมูลตัวแรกจะเป็ นข ้อมูลทีอยู
ล่างสุดของ Stack และ ข ้อมูลสุดท ้ายจะ
่ บ
่
เป็ นข ้อมูลทีอยู
่ นสุด ของ Stack เมือมี
่ ่
การนาข ้อมูลออกจาก Stack ข ้อมูลทีอยู
่ าลงสูS
บนสุด นั่นคือข ้อมูลทีน
่ tack เป็ น
่
ข ้อมูลสุดท ้าย จะเป็ นข ้อมูลทีจะต
้องนา
Data Structure
Department of Computer Science
Push Stack
• Algorithm
1. ตรวจสอบว่า Stack เต็ม ? (โดยการตรวจสอบ
ว่า Top เท่ากับ N)
- ถ ้า Stack เต็ม ให ้แสดงข ้อความว่า "Stack
Overflow" แล ้วเลิกงาน
- ถ ้า Stack ไม่เต็ม ให ้ทางานข ้อที่ 2 และ 3
่ าของ Top อีก 1
2. ให ้เพิมค่
ใส่ข ้อมูลลงใน Stack ในตาแหน่
งของตั
วแปร
Data3.
Structure
Department
of Computer
Science
Operation ของ Stack
1. Push Stack เป็ น operation สาหร ับ
นาข ้อมูลลงใน Stack
2. Pop Stack เป็ น operation สาหร ับ
นาข ้อมูลออกจาก Stack
Data Structure
Department of Computer Science
ตัวอย่างการทางานของ
Operation Push และ Pop
Data Structure
Department of Computer Science
Implementation Stack
• การ implement Stack ทาได้ 2 วิธ ี คือ
1. Array Implementation
2. Linked List Implementation
• Array Implementation ข้อตกลง
้ ้
1) กาหนดให ้จานวนข ้อมูลสูงสุดคือ N ทังนี
เพราะว่าการกาหนด Array จะต ้องระบุจานวน
่
ข ้อมูลสูงสุดทีจะเก็
บลงใน Array
2) กาหนดให ้ตัวแปร Top แทนจานวนข ้อมูลที่
Data Structure
Department of Computer Science
มีอยูใ่ น Stack
Flowchart
Department of Computer Science
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
• Pascal
Procedure Push ( X ) ;
Begin
If Top=N Then
Writeln ( " Stack Overflow " )
Else
Begin
Top := Top + 1 ;
Stack [ Top ] := X ;
End;
End;
Data Structure
Department of Computer Science
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
• C,C++
Push ( int X )
{
if (Top = = N)
printf ( " Stack Oerflow " );
else
{
Top = Top + 1 ;
Stack [ Top ] = X ;
}
}
Data Structure
Department of Computer Science
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
่ั
• C,C++ ฟั งก ์ชนการ
Push
int Push ( int what)
{
if (Top<MAX-1)
{ top++;
stackdata[top]=what;
return 1;
}
return -1;
}
Data Structure
Department of Computer Science
่ั
ฟั งก ์ชนการ
Push
้ นการนาข ้อมูลเข ้าสู่ Stack คือ ถ ้า top
• ฟังก ์ช ันนี เป็
่ คอื ถ ้า Stack ยังไม่เต็ม ก็ให ้
น้อยกว่า MAX-1 ซึงก็
่ งมาทางพารามิเตอร ์ what
top++ และเก็บข ้อมูลทีส่
้ ่น้ันเอง
ลงไปในตัวแปร stackdata ช่องที่ top ชีอยู
่ ยกใช ้เป็ นการบอก
จากนั้น return 1 กลับไปยังจุดทีเรี
้ ้ push เรียบร ้อยแล ้วนั่นเอง แต่ถ ้า
สถานะว่าตอนนี ได
่
เงือนไข
if ไม่เป็ นจริง มันก็จะลงมาทาที่ return-1
้ นค่า -1 แสดงว่า stack เต็มแล ้ว
ดังนั้น ฟังก ์ช ันนี คื
นั่นเอง
Data Structure
Department of Computer Science
..ตัวอย่างการทางานของ Push
Stack..
• ทาการ Push ข้อมู ลต่อไปนี ้ 9 5 7 2 8 เข้าเก็บ
ใน Stack
• ดูต ัวอย่าง
Data Structure
Department of Computer Science
Pop Stack
• Algorithm
1. ตรวจสอบว่า Stack ว่าง ? (โดยการ
ตรวจสอบว่า Top เท่ากับ 0)
- ถ ้า Stack ว่าง ให ้แสดงข ้อความว่า
"Stack Empty" แล ้วเลิกงาน
- ถ ้า Stack ยังมีข ้อมูล ให ้ทางานข ้อที่ 2
และ 3
2. ให ้นาข ้อมูลออกจาก Stack
Data Structure
Department of Computer Science
Flowchart
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
• Pascal
Procedure Pop ( Var X : Integer ) ;
Begin
If Top=0 Then
Writeln ( " Stack Empty " )
Else
Begin
X := Stack [ Top ] ;
Top := Top - 1 ;
End;
End;
Data Structure
Department of Computer Science
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
• C,C++
Pop ( int X )
{
if (Top = = 0)
printf ( " Stack Empty " );
else
{
X = Stack [ Top ] ;
Top = Top - 1 ;
}
}
Data Structure
Department of Computer Science
Program
้ น Stack ของ
ต ัวอย่างโปรแกรมนี เป็
Integer
่ั
• C,C++ ฟั งก ์ชนการ
Pop
int pop()
{
int r;
if (top>-1)
{
r=stack[top];
stack[top]=0;
top--;
return r;
}
return -1;
}
Data Structure
Department of Computer Science
่ั
ฟั งก ์ชนการ
Pop
การเอาข ้อมูลออกจาก Stack ได ้นั้น ก็เพียงแค่คน
ื ค่าข ้อมูล
้ ก
่ Pop ได ้นั้นจะต ้องดู
ตัวที่ top นั้นชีอยู
่ ลับไป แต่กอ
่ นทีจะ
ด ้วยว่า top นั้นเป็ น -1 หรือไม่ ถ ้าเป็ น -1 ก็แสดงว่าตอนนั้น
Stack ว่าง ให ้คืนค่า -1 กลับไป แต่ถ ้า top >-1 แสดงว่ามัม
้ ่
มีข ้อมูลอยูภ
่ ายใน Stack ดังนั้น ให ้คืนค่าตัวที่ top ชีอยู
กลับไป และลดค่า top ลงอีก 1
Data Structure
Department of Computer Science
..ตัวอย่างการทางานของ Pop
Stack..
• ทาการ Pop ข้อมู ลต่อไปนี ้ 8 2 7 5 9 ออกจาก
Stack
• ดูต ัวอย่าง
Data Structure
Department of Computer Science
ต ัวอย่างโปรแกรมแสดงการทางานของ
Stack ต ัวอย่างที่ 1
#include <stdio.h>
#include <stdlib.h>
้ั อไฟล
่
#include <conio.h>
ตงชื
์ว่า Stack1.
#define MAX 10
int stackdata[MAX];
int top =-1;
int Push(int what)
{
if (top<MAX-1)
{
top++;
stackdata[top] = what;
return 1;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
Stack ตัวอย่างที่ 1 (ต่อ)
int Pop()
{
int r;
if (top>-1)
{
r=stackdata[top];
stackdata[top]=0;
top--;
return r;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
่ 1 (ต่อ)
Stack
ตั
ว
อย่
า
งที
void main()
{
clrscr();
Push(7);
Push(12);
Push(23);
Push(2);
Push(33);
Push(10);
printf("Pop=%d\n",Pop());
printf("Pop=%d\n",Pop());
printf("Pop=%d\n",Pop());
printf("Pop=%d\n",Pop());
getch();
Run
Pop = 10
Pop = 33
Pop = 2
Pop = 23
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
Stack ตัวอย่างที่ 2 (ต่อ)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
่
้ั อไฟล
์ว่า Stack2.c
ตงชื
#define MAX 10
int stackdata[MAX];
int top =-1;
int Push(int what)
{
if (top<MAX-1)
{
top++;
stackdata[top] = what;
return 1;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
Stack ตัวอย่างที่ 2 (ต่อ)
int Pop()
{
int r;
if (top>-1)
{
r=stackdata[top];
stackdata[top]=0;
top--;
return r;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
่ 2 (ต่อ)
Stack
ตั
ว
อย่
า
งที
void main()
{
clrscr();
Push(7);
Push(12);
Push(23);
Push(2);
Push(33);
Push(10);
for (int i=0;i<8;i++)
{
printf("Pop=%d\n",Pop());
}
getch();
Run
Pop = 10
Pop = 33
Pop = 2
Pop = 23
Pop = 12
Pop = 7
Pop = -1
Pop = -1
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
่ 3 (ต่อ)
Stack
ตั
ว
อย่
า
งที
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
่
้ั อไฟล
์ว่า Stack3.c
ตงชื
#define MAX 10
int stackdata[MAX];
int top =-1;
int Push(int what)
{
if (top<MAX-1)
{
top++;
stackdata[top] = what;
return 1;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
่ 3 (ต่อ)
Stack
ตั
ว
อย่
า
งที
int Pop()
{
int r;
if (top>-1)
{
r=stackdata[top];
stackdata[top]=0;
top--;
return r;
}
return -1;
}
Data Structure
Department of Computer Science
ตัวอย่างโปรแกรมแสดงการทางานของ
่
Stack
ตั
ว
อย่
า
งที
3 (ต่อ)
void main()
{
clrscr();
Push(7);
Push(12);
Push(23);
Push(2);
Push(33);
Push(10);
for (int i=0;i<50;i++)
{
int result=Pop();
if (result==-1)
{
printf("Stack is empty\n");
getch();
break;
}
printf("Pop=%d\n", result);
getch();
}
Run
Pop = 10
Pop = 33
Pop = 2
Pop = 23
Pop = 12
Pop = 7
Stack is empty
}
Data Structure
Department of Computer Science
่
การใช้ สแตค เพือแปลรู
ปนิ พจน์
ทางคณิ ตศาสตร ์
รูปแบบนิ พจน์ทางคณิ ตศาสตร ์
่
• นิ พจน์ Infix คือ นิ พจน์ทเครื
ี่ องหมายด
าเนิ นการ
(Operator) อยู่ระหว่างตัวดาเนิ นการ (Operands)
เช่น A+B-C
่
• นิ พจน์ Prefix คือ นิ พจน์ทเครื
ี่ องหมายด
าเนิ นการ
(Operator) อยู่หน้าตัวดาเนิ นการ (Operands) เช่น
+-AB
่
• นิ พจน์ Postfix คือ นิ พจน์ทเครื
ี่ องหมายด
าเนิ นการ
(Operator) อยู่หลังตัวดาเนิ นการ (Operands) เช่น
AC*+
Data Structure
Department of Computer Science
ตัวอย่างนิ พจน์คณิ ตศาสตร ์ในรูปแบบต่าง
• นิ พจน์ Infix
นิ พจน์ Postfix
นิ พจน์ Prefix
• A+B-C
AB+C+ABC
• A+B*C-D/E
ABC*+DE/+A*BC/DE
• A*B+C-D/E
AB*C+DE/+*ABC/DE
Data Structure
Department of Computer Science
การแปลงนิ พจน์ Infix ให้เป็ น
Postfix
่ ้เครืองค
่ านวณต ้องเขียนนิ พจน์ที่
• เขียนโปรแกรมสังให
่ พจน์เหล่านี เรี
้ ยกว่า
ต ้องการไปในตัวโปรแกรม ซึงนิ
นิ พจน์ Infix คือนิ พจน์ทมี
ี่ โอเปอร ์เรเตอร ์
(Operator) อยู่ระหว่างโอเปอร ์แรนด ์ (Operand)
้
่
ทังสอง
เช่น A+B เครืองหมาย
+ เป็ นโอเปอร ์เรเตอร ์
่ นว่าเป็ นนิ พจน์ที่
ระหว่างโอเปอร ์แรนด ์ A และ B ซึงเห็
มนุ ษย ์คุ ้นเคย ข ้อเสียของนิ พจน์ infix ทีททาให ้
คอมไพเลอร ์ยุ่งยาก คือลาดับความสาคัญของ
่ างกัน เช่น
โอเปอร ์เรเตอร ์ (Precedence) ทีต่
่
เครืองหมายยกก
าลัง (ใช ้ ^ ในการเขียนโปรแกรม)
Data Structure
Department of Computer Science
่
การแปลงนิ พจน์ Infix ให้เป็ น
Postfix
่
• เมือการประมวลนิ
พจน์ infix เป็ นไปด ้วยความยากที่
่
การคานวณไม่เป็ นไปตามลาดับของเครืองหมาย
่ กอ
โอเปอร ์เรเตอร ์ทีมี
่ นหลัง คอมไพเลอร ์จึงแปลง
นิ พจน์ infix ให ้เป็ น postfix เสียก่อน
• นิ พจน์ Postfix ก็คอื นิ พจน์ทมี
ี่ โอเปอเรเตอร ์อยู่หลัง
้
โอเปอร ์แรนด ์ทังสองของมั
น เช่น
AB+ หมายถึง
A+B
AB- หมายถึง
A-B
AB* หมายถึง
A*B
Data Structure
Department of Computer Science
การแปลงนิ พจน์ Infix ให้เป็ น
Postfix
่
• Operator คือเครืองหมายกระท
า+-*/^
• Operand คือตัวแปรต่าง A,B,C,D,E เช่น
A+B*C,(A*B)-C
Data Structure
Department of Computer Science
ลาดับความสาคัญ Operator
่
เครืองหมายยกก
าลัง ^
่
เครืองหมายคู
ณกับหาร *,/
่
เครืองหมายบวกกั
บลบ +,่
เครืองหมายวงเล็
บ () กระทาก่อนเช่น
A+(B*C)
่
5. เครืองหมายระดั
บเดียวกันไม่มวี งเล็บให ้ทาจาก
ซ ้ายไปขวา เช่น A+B+C
1.
2.
3.
4.
Data Structure
Department of Computer Science
ตัวอย่างนิ พจน์ทางคณิ ตศาสตร ์และลาดับ
การคานวณ
Data Structure
Department of Computer Science
อ ัลกอริทม
ึ การแปลงนิ พจน์ Infix เป็ น
นิ พจน์ Postfix
• เราสามารถแปลงนิ พจน์ Infix ให ้เป็ น Postfix
่ คณ
ได ้โดยอาศัยสแตคทีมี
ุ สมบัตก
ิ ารเข ้าหลัง
ออกก่อนหรือ LIFO โดยมีอลั กอริทม
ึ ในการ
แปลงนิ พจน์ ดังนี ้
1. ถ ้าข ้อมูลเข ้า (input) เป็ นตัวถูกดาเนิ นการ
(operand) ให ้นาออกไปเป็ นผลลัพธ ์ (output)
2. ถ ้าข ้อมูลเข ้าเป็ นตัวดาเนิ นการ (operator)
ให ้ดาเนิ นการดังนี ้
2.1 ถ ้าสแตคว่าง ให ้ push operator ลง
ในสแตค
Data Structure
Department of Computer Science
อ ัลกอริทม
ึ การแปลงนิ พจน์ Infix เป็ น
นิ พจน์ Postfix
• 2.2 ถ ้าสแตคไม่วา่ ง ให ้เปรียบเทียบ operator
่ ้ามากับ operator ทีอยู
่ ใ่ นตาแหน่ ง TOP
ทีเข
ของสแตค
่ ้ามามีความสาคัญ
2.2.1 ถ ้า operator ทีเข
่ าแหน่ ง TOP
มากกว่า operator ทีต
ของสแตคให ้ push ลงสแตค
่ ้ามามีความสาคัญ
2.2.2 ถ ้า operator ทีเข
่ ใ่ น
น้อยกว่าหรือเท่ากับ operator ทีอยู
ตาแหน่ ง TOP ของสแตค ให ้ pop สแตคออก
ไปเป็ นผลลัพธ ์ แล ้วทาการเปรียบเทียบ
อ ัลกอริทม
ึ การแปลงนิ พจน์ Infix เป็ น
นิ พจน์ Postfix
• 3. ถ ้าข ้อมูลเข ้าเป็ นวงเล็บเปิ ด ให ้ push
ลงสแตค
4. ถ ้าข ้อมูลเข ้าเป็ นวงเล็บปิ ด ให ้ pop ข ้อมูล
ออกจากสแตคไปเป็ นผลลัพธ ์จนกว่าจะถึง
้
้
วงเล็บ เปิ ด จากนั้นทิงวงเล็
บเปิ ดและปิ ดทิงไป
5. ถ ้าข ้อมูลเข ้าหมด ให ้ pop ข ้อมูลออก
จากสแตคไปเป็ นผลลัพธ ์จนกว่าสแตคจะว่าง
Data Structure
Department of Computer Science
ตัวอย่างการแปลงนิ พจน์ Infix เป็ นนิ พจน์
Postfix
• นิ พจน์ A + B * C
นิ พจน์ (A * B) + (C / D)
นิ พจน์ A / B + (C – D)
นิ พจน์ (A + B) * ( C ^ D – E ) * F
Stack
s
•
•
Stack
Tower Of
Hanoi
้
ขันตอนการค
านวณจาก
นิ พจน์ Postfix
่
ในการคานวณค่า Postfix ทีแปลงมาแล
้ว
ตัวแปลภาษาจะทา
การคานวณโดยใช ้โครงสร ้างสแตกช่วยอีก
เช่นกัน
้
ขันตอนในการค
านวณ
1. อ่านตัวอักษรในนิ พจน์ Postfix จากซ ้าย
ไปขวาทีละ
ตัวอักษร
2. ถ ้าเป็ นตัวถูกดาเนิ นการ ให ้ทาการ push
ตัวถูกดาเนิ นการ
Department of Computer Science
Data Structure
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
4. ทาการคานวณ ตัวถูกดาเนิ นการตัวที่ 1
ด ้วยตัวถูก ดาเนิ นการตัวที่ 2 โดยใช ้ตัว
ดาเนิ นการในข ้อ 3
่ ้จากการ
5. ทาการ push ผลลัพธ ์ทีได
คานวณในข ้อ 4 ลงสแตก
6. ถ ้าตัวอักษรในนิ พจน์ Postfix ยังอ่านไม่
หมดให ้กลับไปทา
ข ้อ 1 ใหม่
Data Structure
Department of Computer Science
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
้
ตัวอย่าง ขันตอนการค
านวณจากนิ พจน์
Postfix ABC+D-*E/
1. ABC+D-*E/
Push B
Push A
A
Data Structure
2. ABC+D-*E/
B
A
Department of Computer Science
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
3. ABC+D-*E/
Push C
Data Structure
C
B
A
4. ABC+D-*E/
1. Pop C
2. Pop B
3. B+C
4. Push B+C
B+C
A
Department of Computer Science
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
5. ABC+D-*E/
Push D
Data Structure
D
B+C
A
6. ABC+D-*E/
1. Pop D
2. Pop B+C
3. B+C-D
4. Push B+C-D
B+C-D
A
Department of Computer Science
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
8. ABC+D-*E/
7. ABC+D-*E/
1. Pop B+C-D
2. Pop A
3. A*B+C-D
4. Push A*B+C-D
Data Structure
Push E
A*B+C-D
E
A*B+C-D
Department of Computer Science
้
ขันตอนการค
านวณจากนิ พจน์
Postfix
9. ABC+D-*E/
1. Pop E
2. Pop A*B+C-D
3. A*B+C-D/E
4. Push A*B+C-D/E
A*B+C-D/E
่ ใ่ นสแตกคือคาตอบทีต
่ ้องการ
10. ค่าสุดท ้ายทีอยู
Data Structure
Department of Computer Science
Data Structure
Department of Computer Science
Data Structure
Department of Computer Science