สถิติการเข้าชม

วันอังคารที่ 4 สิงหาคม พ.ศ. 2552

DTS 06-29/07/52

สรุป
โดยโอเปอเรเตอร์ก็คือเครื่องหมายการคำนวณต่างๆ
เช่น + - * / ในขณะที่ตัวโอเปอแรนด์ซึ่งเป็นตัวถูกดำเนินการนั้น
อาจเป็นได้ทั้งตัวแปรหรือค่าคงที่ใดๆ โดยนิพจน์ทางคณิตศาสตร์
สามารถนำเสนอให้แตกต่างกันได้ถึง 3 รูปแบบ ด้วยกัน ดังนี้
1. นิพจน์ Infix
นิพจน์คณิตศาสตร์ที่อยู่ในรูปแบบของ Infix นั้น ก็คือนิพจน์
โดยทั่วไปที่เรามักใช้กับการคำนวณสูตรตัวเลขต่างๆ โดย
โอเปอเรเตอร์จะอยู่ระหว่างตัวโอเปอแรนด์

2. นิพจน์ Postfix
นิพจน์คณิตศาสตร์ที่อยู่ในรูปแบบของ Postfix นั้น คือ
นิพจน์ในรูปแบบที่โอเปอเรเตอร์จะอยู่ข้างหลังตัวโอเปอแรนด์

3. นิพจน์ Prefix
นิพจน์คณิตศาสตร์ที่อยู่ในรูปแบบของ Prefix จะตรงกันข้าม
กับ Postfix โดยจะนำโอเปอเรเตอร์ไปไว้อยู่ข้างหน้าตัวโอเปอแรนด์

สำหรับนิพจน์ทั้งสามรูปแบบ สามารถแสดงได้ตามตัวอย่างข้างล่างดังนี้
Prefix : +AB
Infix : A+B
Postfix : AB+

อัลกอริทึมการแปลงนิพจน์ Infix มาเป็นนิพจน์ Postfix มีขั้นตอน ดังนี้
1. ถ้าข้อมูลเข้าเป็นโอเปอแรนด์ ให้เอาต์พุตไป Postfix

2. ถ้าข้อมูลเข้าเป็นโอเปอเรเตอร์
2.1 ถ้าสแตกว่าง ให้ push ลงในสแตก
2.2 ถ้าภายในสแตกมีข้อมูลอยู่ ให้ทำการเปรียบเทียบ ดังนี้
2.3 ถ้าโอเปอเรเตอร์ที่อินพุตเข้ามามีลำดับความสำคัญน้อยกว่า
หรือเท่ากับ โอเปอเรเตอร์ที่อยู่ส่วนบนของสแตก ให้ดำเนินการ pop
สแตกออกไปที่ postfix โดยทำการเปรียบเทียบกับโอเปอเรเตอร์ที่มี
อยู่ในสแตกไปเรื่อยๆ จนกระทั่งโอเปอเรเตอร์ที่อินพุตเข้ามามีลำดับ
ความสำคัญมากกว่าโอเปอเรเตอร์ในสแตก จากนั้นให้ดำเนินการ push
โอเปอเรเตอร์ที่อินพุตเข้ามาลงในสแตก
2.4. ถ้าโอเปอเรเตอร์ที่อินพุตเข้ามามีลำดับความสำคัญมากกว่า
โอเปอเรเตอร์ที่อยู่ส่วนบนของสแตกให้ดำเนินการ push โอเปอเรเตอร์
นั้นลงในสแตก

3. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บเปิด ให้ดำเนินการ push
ลงในสแตก

4. ถ้าข้อมูลเข้าเป็นเครื่องหมายวงเล็บปิด ให้ดำเนินการ pop สแตก
ไปยัง postfix จนกระทั่งพบเครื่องหมายวงเล็บเปิด จากนั้นให้นำ
เครื่องหมายวงเล็บทั้งสองทิ้งไป

5. หากดำเนินการจนเสร็จสิ้นแล้วยังคงมีข้อมูลอยู่ในสแตก ให้ดำเนินการ
pop สแตกที่เหลืออยู่ทั้งหมดไปที่ postfix

วันเสาร์ที่ 1 สิงหาคม พ.ศ. 2552

DTS 05-22/07/52

สรุป
สแตก(Stack)เป็นโครงสร้างข้อมูลแบบลิเนียร์ลิสต์(linear list)
ที่สามารถนำข้อมูลเข้าหรือออกได้ทางเดียวคือส่วนบนของสแตกหรือ
หรือเรียกว่า ท๊อปของสแตก (Top Of Stack) ซึ่งคุณสมบัติดังกล่าว
เรียกว่า ไลโฟลิสต์ (LIFO list: Last-In-First-Out list)หรือ
พูชดาวน์ลิสต์ (Pushdown List) คือสมาชิกที่เข้าลิสต์ที่หลังสุด
จะได้ออกจากลิสต์ก่อน หรือ เข้าหลังออกก่อน การเพิ่มข้อมูลเข้า
สแตกจะเรียกว่าพูชชิ่ง (pushing) การนำข้อมูลจากสแตกเรียกว่า
ป๊อปปิ้ง (poping) การเพิ่มหรือลบข้อมูล ในสแตกทำที่ท๊อปของสแตก
ท๊อปของสแตกนี้เองเป็นตัวชี้สมาชิกตัวท้ายสุดของสแตก


สแตกจะประกอบด้วยกระบวนการ 3 กระบวนการ คือ

1. Push คือ การนำข้อมูลใส่ในสแตก และสามารถตรวจสอบว่าสแตกเต็ม
หรือไม่ ถ้าไม่เต็มสามารถเพิ่มข้อมูลลงไปได้ แล้วปรับตัวชี้ตำแหน่งให้ไป
ชี้ที่สแตกว่าง ถ้าเต็ม (Stack Overflow)ก็ไม่สามารถเพิ่มข้อมูลได้

2. Pop คือ การนำข้อมูลออกจากส่วนบนสุดของสแตก ถ้ามีข้อมูลออก
จากสแตก เพียงหนึ่งตัว จะเกิดสภาวะว่าง (Stack Empty)คือการไม่มี
ข้อมูลในสแตก ถ้าไม่มีข้อมูลในสแตก แล้วทำการ Popจำทำให้เกิดความ
ผิดพราดที่เรียกว่า Stack Underflow

3. Stack Top คือ การคัดลอกข้อมูลที่อยู่บนสุดของสแตก แต่ไม่ได้นำ
ข้อมูลออกจากสแตก

ตัวอย่างการทำงานแบบโครงสร้างข้อมูลแบบสแตกที่สามารถเห็นได้ใน
ชีวิตประจำวันทั่วไป

1. การส่งการบ้านอาจารย์ เอามาวางซ้อนกันขึ้นเรื่อยๆ ใครส่งช้าก็ได้ตรวจก่อน

2. ตอนที่กินน้ำใน บิ๊กซี แก้วน้ำจะเป็นกรวยสีขาว

3. ตอนที่พนักงานตักไอศครีม ต้องตักข้างบนก่อน

4. ตอนที่เก็บเสื้อผ้าใส่กระเป๋าเดินทาง ตัวที่พับที่หลัง เมื่อเปิดกระเป๋าก็จะถูก
หยิบออกมาก่อน

5. ซื้อเมนทอลเป็นแท่งในเซเว่น เม็ดที่ถูกผลิตก่อนจะใส่ลงไปก่อนเวลาที่เรา
เปิดทาน เราจะได้ทานเม็ดที่เข้าที่หลัง

6. ขนมปังของฟาร์มเฮาร์ที่เป็นแผ่นเปล่า ถูกเรียงกันขึ้นเป็นหลายสิบแผ่นแต่
แผ่นที่ผลิดก่อนจะอยู่ข้างล่าง แผ่นที่ผลิตที่หลังจะอยู่ด้านบนเวลาเราทานก็
จะเปิดทานที่ด้านบนก่อน

DTS 04-15/07/52

สรุป
ลิงค์ลิสต์ (Linked List) เป็นวิธีการเก็บ ข้อมูลอย่างต่อเนื่อง
ของอิลิเมนต์ต่าง ๆโดยมีพอยเตอร์เป็นตัวเชื่อมต่อแต่ละอิลิเมนท์
เรียกว่าโนด (Node)ซึ่งในแต่ละโนดจะประกอบไปด้วย 2 ส่วน
คือData จะเก็บข้อมูลของอิลิเมนท์ และส่วนที่สอง
คือLink Field จะทำหน้าที่เก็บตำแหน่งของโนดต่อไปในลิสต์
ในส่วนของ data อาจจะเป็นรายการเดี่ยวหรือเป็นเรคคอร์ดก็ได้
ในส่วนของ link จะเป็นส่วนที่เก็บตำแหน่งของโหนดถัดไปในโหนด
สุดท้ายจะเก็บค่า Null ซึ่งไม่ได้ชี้ไปยังตำแหน่งใด ๆเป็นตัวบอกการ
สิ้นสุดของลิสต์ในลิงค์ลิสต์จะมีตัวแปรสำหรับชี้ตำแหน่งลิสต์
(List pointer variable)ซึ่งเป็นที่เก็บตำแหน่งเริ่มต้นของลิสต์ ซึ่งก็คือ
โหนดแรกของลิสต์นั่นเอง ถ้าลิสต์ไม่มีข้อมูล ข้อมูลในโหนดแรก
ของลิสต์จะเป็นNull


โครงสร้างข้อมูลแบบลิงค์ลิสต์โครงสร้างข้อมูลแบบลิงค์ลิสต์จะแบ่งเป็น
2 ส่วน คือ

1. Head Structure จะประกอบไปด้วย 3 ส่วนได้แก่จำนวนโหนดในลิสต์
(Count) พอยเตอร์ที่ชี้ไปยังโหนดที่เข้าถึง (Pos) และพอยเตอร์ที่ชี้ไปยัง
โหนด ข้อมูลแรกของลิสต์ (Head)

2. Data Node Structure จะประกอบไปด้วยข้อมูล(Data) และพอยเตอร์ที่
ชี้ไปยัง ข้อมูลตัวถัดไป

ฟังก์ชัน stdio.h และ iostream.h

#include
#include // clrscr();
void input () ;
void menu () ;
void showEmp();
int i;
int n;
int iEmp=1;
int number;
char select;
struct name {
char name[30];
char surname[40];
int age;
char position[40];
int height;
int weight;
char status[10];
char birthday[40];
}name1[50];
main()
{
while (select != '3'){
menu();
if (select == '1')
{
input();
number++;
}
else if (select == '2')
{
showEmp();
}
else if (select == '3')
break;
else
{
clrscr();
printf("=======================\n");
printf("You Insert Wrong Choice\n");
printf("=======================\n");
printf("Press any key to continue...");
fflush(stdin);
scanf("%c",select);
clrscr();
}
}
clrscr();
printf("Thanks");
return 0;}
void input(void)
{
clrscr();
printf(" ======== Insert Profile ======== \n");
printf("Name : ");
scanf("%s",&name1[iEmp].name);
printf("Surname :");
scanf("%s",&name1[iEmp].surname);
printf("Age : ");
scanf("%d",&name1[iEmp].age);
printf("Position : ");
scanf("%s",&name1[iEmp].position);
printf("Height : ");
scanf("%d",&name1[iEmp].height);
printf("Weight : ");
scanf("%d",&name1[iEmp].weight);
printf("Status : ");
scanf("%s",&name1[iEmp].status);
printf("Birthday : ");
scanf("%s",&name1[iEmp].birthday);
iEmp++;
clrscr();
}
void menu(void)
{
printf("Please Select Menu\n");
printf("==================\n\n");
printf("1.Insert Employee\n");
printf("2.List of Employee\n");
printf("3.Exit Program\n");
printf("> ");
fflush(stdin);
scanf("%c",&select);
}
void showEmp(void)
{
clrscr();
printf("Number Of Employee : %d \n\n",number);
n=1;
i=1;
printf("=====================\n");
while (i ");fflush(stdin);
scanf("%c",&select); // any key to continueclrscr();
}

#include // cin cout
#include // clrscr();
void input () ;
void menu () ;
void showEmp();
int i;
int n;
int iEmp=1;
int number;
char select;
struct name {char name[30];
char surname[40];
int age;
char position[40];
int height;
int weight;
char status[10];
char birthday[40];
}name1[50];
main()
{
while (select != '3')
{
menu();
if (select == '1')
{
input();
number++;
}
else if (select == '2')
{
showEmp();
}
else if (select == '3')
break;
else
{
clrscr();
cout<<"=======================\n"; cout<<"You Insert Wrong Choice\n"; cout<<"=======================\n"; cout<<"Press any key to continue..."; cin>>select;clrscr();
}
}
clrscr();
cout<<"Thanks"; return 0;} void input(void) { clrscr(); cout<<" ======== Insert Profile ======== \n"; cout<<"Name : "; cin>>name1[iEmp].name;
cout<<"Surname :"; cin>>name1[iEmp].surname;
cout<<"Age : "; cin>>name1[iEmp].age;cout<<"Position : "; cin>>name1[iEmp].position;cout<<"Height : "; cin>>name1[iEmp].height;cout<<"Weight : "; cin>>name1[iEmp].weight;cout<<"Status : "; cin>>name1[iEmp].status;cout<<"Birthday : "; cin>>name1[iEmp].birthday;
iEmp++;
clrscr();
}
void menu(void)
{
cout<<"Please Select Menu\n"; cout<<"==================\n\n"; cout<<"1.Insert Employee\n"; cout<<"2.List of Employee\n"; cout<<"3.Exit Program\n"; cout<<"> ";cin>>select;}
void showEmp(void)
{
clrscr();
cout<<"Number Of Employee :"< ";
cin>>select; // any key to continue
clrscr();
}