پشته یک ساختار داده خطی است که از ترتیب خاصی پیروی می کند که در آن عملیات انجام می شود. سفارش ممکن است LIFO اختصاری برای عبارتLast-in-first-out است یعنی ورودی-آخر- خروجی-اول یا FILO ورودی اول آخرین خروج باشد. در اصطلاحشناسی پشته عملیات درج به نام عملیات PUSH نامیده و عملیات حذف به نام POP خوانده میشود.
دو عمل اول ابتدایی پشته ممکن است شامل راه اندازی اولیه پشته استفاده و تخریب باشید . علاوه بر آن وقتی عنصری در پشته قرار میگیرد، معمولاً از این دو عملیات ابتدایی استفاده میشود :
برای اینکه از پشته استفاده بهینه کنیم باید اول وضعیت آن را بررسی کنیم. به همین خاطر چند کارکرد به پشته می توان اضافه کرد:
عملیات Push
فرایند قرار دادن یک عنصر جدید در پشته به نام عملیات push شناخته میشود.این عملیات شامل چندمرحله است:
عملیات POP
دسترسی به محتوای پشته در هنگام حذف آن، به نام عملیات pop شناخته میشود. در پیادهسازی آرایهای از عملیات ()pop، عنصر دادهای واقعاً حذف نمیشود، بلکه به جای آن مقدار top یک واحد کاهش مییابد تا به مقدار کمتری در پشته اشاره کند. یک عملیات pop شامل مراحل زیر است:
صف
مانند (پشته) Stack، (صف) Queue یک ساختار خطی است که از ترتیب خاصی پیروی می کند که در آن عملیات انجام می شود. ترتیب اولین خروجی FIFO (اولین ورودی اولین خروجی) است. یک مثال خوب از صف، هر صف مصرف کننده برای منبعی است که در آن مصرف کننده ای که اول شده است، ابتدا خدمات می دهد.
صف یک ساختار داده است که تا حدودی شبیه پشته محسوب میشود؛ اما بر خلاف پشته، صف از هر دو سمت باز است. از یک سمت همواره برای درج دادهها و از سمت دیگر برای حذف دادهها استفاده میشود. در روش FIFO هر دادههای که اول در صف ذخیره شود، هنگام خروج نیز قبل از همه خارج میشود.
تفاوت بین پشته ها و صف ها در حذف است. در یک پشته، آیتمی را که اخیراً اضافه شده است حذف می کنیم. در یک صف، موردی را که اخیراً کمترین اضافه شده است حذف می کنیم.
عملیات در صف
به طور عمده چهار عملیات اساسی زیر در صف انجام می شود:
در زندگی واقعی و روزمره:
در دنیای کامپیوتر:
در زندگی روزمره و واقعی:
در دنیای کامپیوتر:
کد cpp:
#include <iostream> using namespace std; int stack[100], n=100, top=-1; void push(int val) { if(top>=n-1) cout<<"Stack Overflow"<<endl; else { top++; stack[top]=val; } } void pop() { if(top<=-1) cout<<"Stack Underflow"<<endl; else { cout<<"The popped element is "<< stack[top] <<endl; top--; } } void display() { if(top>=0) { cout<<"Stack elements are:" for(int i=top; i>=0; i--) cout<<stack[i]<<" " cout<<endl; } else cout<<"Stack is empty" } int main() { int ch, val; cout<<"1) Push in stack"<<endl; cout<<"2) Pop from stack"<<endl; cout<<"3) Display stack"<<endl; cout<<"4) Exit"<<endl; do { cout<<"Enter choice: "<<endl; cin>>ch; switch(ch) { case 1: { cout<<"Enter value to be pushed:"<<endl; cin>>val; push(val); break; } case 2: { pop(); break; } case 3: { display(); break; } case 4: { cout<<"Exit"<<endl; break; } default: { cout<<"Invalid Choice"<<endl; } } }while(ch!=4); return 0; }
خروجی:
1) Push in stack 2) Pop from stack 3) Display stack 4) Exit Enter choice: 1 Enter value to be pushed: 2 Enter choice: 1 Enter value to be pushed: 6 Enter choice: 1 Enter value to be pushed: 8 Enter choice: 1 Enter value to be pushed: 7 Enter choice: 2 The popped element is 7 Enter choice: 3 Stack elements are:8 6 2 Enter choice: 5 Invalid Choice Enter choice: 4 Exit
در برنامه بالا تابع push مقدار آرگومان را می گیرد و وارد پشته می کند. اگر top بزرگتر یا مساوی با n بود یعنی هیچ جایی در استک باقی نمانده و overflow پرینت می شود. در ادامه می توانید ببینید:
void push(int val) { if(top>=n-1) cout<<"Stack Overflow"<<endl; else { top++; stack[top]=val; } }
همانطور که در زیر می بینید تابع pop مقدار بالایی در پشته را pop می کند و اگر پشته خالی باشد underflow پرینت می شود:
void pop() { if(top<=-1) cout<<"Stack Underflow"<<endl; else { cout<<"The popped element is "<< stack[top] <<endl; top--; } }
تابع display تمام مقادیر پشته را نمایش می دهد. برای اینکار از حلقه for استفاده می کند و اگر پشته خالی باشد stack is empty پرینت می شود:
void display() { if(top>=0) { cout<<"Stack elements are:" for(int i=top; i>=0; i--) cout<<stack[i]<<" " cout<<endl; }else cout<<"Stack is empty" }
تابع main انتخاب هایی در اختیار کاربر قرار می دهد که آیا او می خواد عمل push, pop یا display را در پشته انجام دهد. با توجه به پاسخ کاربر تابع مناسب با استفاده از switch صدا زده می شود. اگر کاربر پاسخی ناموجود یا غیر تعریف شده بدهد invalid choice پرینت می شود:
int main() { int ch, val; cout<<"1) Push in stack"<<endl; cout<<"2) Pop from stack"<<endl; cout<<"3) Display stack"<<endl; cout<<"4) Exit"<<endl; do { cout<<"Enter choice: "<<endl; cin>>ch; switch(ch) { case 1: { cout<<"Enter value to be pushed:"<<endl; cin>>val; push(val); break; } case 2: { pop(); break; } case 3: { display(); break; } case 4: { cout<<"Exit"<<endl; break; } default: { cout<<"Invalid Choice"<<endl; } } }while(ch!=4); return 0; }
گردآورندگان:
استاد: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندن. Linkedin