PDA

View Full Version : سوال: جابجایی دو عنصر در صف



saed2006
پنج شنبه 09 اردیبهشت 1389, 21:15 عصر
یک عنصر در صف ذخیره شده میخوام جاش با عنصر قبلی عوض بشه چجوری میشه

mehdi.mousavi
پنج شنبه 09 اردیبهشت 1389, 23:03 عصر
یک عنصر در صف ذخیره شده میخوام جاش با عنصر قبلی عوض بشه چجوری میشه

سلام.
این کاری که میخواهید انجام بدید با تعریف صف در تناقض هستش. اگر میخواهید همچین کاری کنید، قاعدتا باید از یک Data Structure دیگه استفاده کنید. اما فقط برای مثال، (به بیان دیگه، این کار رو در کدتون انجام ندید)، میتونید بدین شکل عمل کنید:


Queue<int> q = new Queue<int>();
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
q.Enqueue(4);

int[] array = q.ToArray();
int temp = array[1];
array[1] = array[2];
array[2] = temp;

q = new Queue<int>(array);


موفق باشید.

mohsensaghafi
جمعه 10 اردیبهشت 1389, 01:49 صبح
سلام دوست عزیز.
برای این کار می تونی از یه صف کمکی استفاده کنی. داده هات رو از صف اول deQueue کن و به صف دوم EnQueue کن. به دادخ مد نظر که رسیدی تغییراتت رو اعمال کن و نهایتاً وقتی تمام داده ها به صف دوم انتقال پیدا کرد، دو باره تمام داده ها رو به صف اولت بر گردون.

saed2006
چهارشنبه 15 اردیبهشت 1389, 16:38 عصر
سلام.
این کاری که میخواهید انجام بدید با تعریف صف در تناقض هستش. اگر میخواهید همچین کاری کنید، قاعدتا باید از یک Data Structure دیگه استفاده کنید. اما فقط برای مثال، (به بیان دیگه، این کار رو در کدتون انجام ندید)، میتونید بدین شکل عمل کنید:


Queue<int> q = new Queue<int>();
q.Enqueue(1);
q.Enqueue(2);
q.Enqueue(3);
q.Enqueue(4);

int[] array = q.ToArray();
int temp = array[1];
array[1] = array[2];
array[2] = temp;

q = new Queue<int>(array);


موفق باشید.

ممنون
یک صف ممکنه تعداد زیادی ایتم داشته باشه یک الگوریتم یا تیکه کدی که بتونه یک ایتم از صف رو بگیره و اون رو یکی به جلو ببره میتونید بهم بدین

mehdi.mousavi
چهارشنبه 15 اردیبهشت 1389, 17:15 عصر
ممنون یک صف ممکنه تعداد زیادی ایتم داشته باشه یک الگوریتم یا تیکه کدی که بتونه یک ایتم از صف رو بگیره و اون رو یکی به جلو ببره میتونید بهم بدین

سلام.
برای پاسخ به سوال شما، ابتدا باید ببینیم در "ساختمان داده ها"، Queue رو چطور تعریف می کنیم. Queue یا FIFO ساختمان داده ای هستش که عناصر جدید از انتهای صف اضافه میشن و عنصر سر صف، از توی صف خارج میشه. به بیان دیگه، هر کی زودتر در صف قرار گرفت، زودتر هم از صف خارج میشه (FIFO).

کلاس Queue نیز بر اساس این تعریف ساخته شده. مهم نیست در مورد چه زبان برنامه نویسی صحبت می کنیم، C#، C++ یا ... هر جا، هر کسی بخواد Queue پیاده سازی کنه، بر اساس تعریف فوق اینکارو میکنه.

در نتیجه، چیزی که شما دنبالش هستید عملا میسر نیستش و نیازی نادرسته. مگه اینکه هدفتون استفاده از Priority Queue (http://www.devsource.com/c/a/Languages/A-Priority-Queue-Implementation-in-C/) باشه، که متاسفانه در BCL چنین چیزی پیاده سازی نشده، اما میتونید از لینکی که دادم استفاده کنید...

اما سوال اصلی من این هستش، که چرا شما هنوز در استفاده از Queue اصرار می ورزید در حالیکه نیاز به جابجایی عناصر صف دارید؟ مگه ساختمان داده های دیگه به کارتون نمیاد؟

موفق باشید.

saed2006
چهارشنبه 15 اردیبهشت 1389, 17:33 عصر
ممنون
قبلا hashtable , arraylist رو امتحان کردم
ولی چون ترتیب توی کار خیلی مهم بود واسم تصمیم گرفتم از صف استفاده کنم
پروژه رو بر مبنای صف ساختم تا اینکه کار فرما یه نیاز جدیدشو مطرح کرد که کار بر بتونه این ترتیب رو بهم بریزه و این شد که تاپیک رو زدم
با توجه به نوع کار من شما چه ساختمان داده ای پیشنهاد میکنید؟

mehdi.mousavi
چهارشنبه 15 اردیبهشت 1389, 17:40 عصر
ممنون
قبلا hashtable , arraylist رو امتحان کردم
ولی چون ترتیب توی کار خیلی مهم بود واسم تصمیم گرفتم از صف استفاده کنم
پروژه رو بر مبنای صف ساختم تا اینکه کار فرما یه نیاز جدیدشو مطرح کرد که کار بر بتونه این ترتیب رو بهم بریزه و این شد که تاپیک رو زدم
با توجه به نوع کار من شما چه ساختمان داده ای پیشنهاد میکنید؟


سلام.
منظورتون دقیقا از ترتیب چی هستش؟ چون Hashtable و ArrayList خیلی متفاوتن... ترتیب بر چه اساسی؟ اضافه شدن به لیست؟ یا ترتیب عناصر بر اساس خصیصه ای که در اونها وجود داره (مثلا نام خانوادگی)؟

شما میتونید از Generic List ها استفاده کنید. اولا مثل ArrayList نیاز به Boxing/Unboxing نداره، ثانیا مثل queue خودتون میتونید عناصر رو به ته لیست اضافه کنید و از ابتدای لیست عناصر رو بردارید، هر وقت هم خواستید میتونید عنصر مورد نظر در Index خاصی رو مستقیما آدرس کنید.


List<int> list = new List<int>();
list.Add(2);
list.Add(3);
list.Add(4);

int item = list[1];


اگر بیشتر توضیح بدید که چه چیزی در این لیست براتون مهمه، شاید SortedList یا List های دیگه ای که موجود هستن، بهتر از لیست فوق الذکر باشن.

موفق باشید.

اَرژنگ
چهارشنبه 15 اردیبهشت 1389, 17:40 عصر
ممنون
قبلا hashtable , arraylist رو امتحان کردم
ولی چون ترتیب توی کار خیلی مهم بود واسم تصمیم گرفتم از صف استفاده کنم
پروژه رو بر مبنای صف ساختم تا اینکه کار فرما یه نیاز جدیدشو مطرح کرد که کار بر بتونه این ترتیب رو بهم بریزه و این شد که تاپیک رو زدم
با توجه به نوع کار من شما چه ساختمان داده ای پیشنهاد میکنید؟

مشکل اصلی چیه ؟ داستان اینکه چه خصوصیاتی لازم هست را توضیح بدید.

کاربر با چی کار میکند؟ صف، هش تیبل و یا لیست آرایه به جواب ربط دارند، سوال واقعی این داستان چیه که استفاده ازشان صلاح آمد.

saed2006
چهارشنبه 15 اردیبهشت 1389, 18:08 عصر
در برنامه کاربر میتونه یه سری مرحله تعریف کنه
ترتیب مراحل توی یک تب نمایش داده شده ممکنه کاربر بخواد ترتیب اون رو عوض کنه
یعنی یک مرحله که اول اجرا شده به اخر بیاد یا بلعکس
پروژه با صف ساخته شده
الان فقط دو تا متد میخوام
moveNext
moveBack

mohsensaghafi
چهارشنبه 15 اردیبهشت 1389, 21:03 عصر
سلام دوست عزیز.
از چه پیاده سازی صفی استفاده کردی. از صف خود C# یا خودت پیاده سازی کردی؟!

saed2006
چهارشنبه 15 اردیبهشت 1389, 21:54 عصر
سلام دوست عزیز.
از چه پیاده سازی صفی استفاده کردی. از صف خود C#‎ یا خودت پیاده سازی کردی؟!

Queue مال خود c# هست

mohsensaghafi
پنج شنبه 16 اردیبهشت 1389, 15:59 عصر
سلام دوست عزیز.
در این حالت باید با استفاده از یک صف کمکی این کار رو بکنی. به این صورت که تا زمانی که به عنصری که می خوای جابجاش کنی نرسیدی، عنصر های رو از صف خارج کن و به صف کمکی وارد کن. زمانی که به عنصر مورد نظر رسیدی، تغییرات رو اعمال کن بعد تمام عناصر دیگه رو هم به صف کمکی اضافه کن و در نهایت، صف کمکی رو جایگذین صف اصلی کن. یا با تغییر آدرس یا اینکه دوباره تمام عناصر رو که الان به اردر مناسبی که می خواستی در اومده تو صف کمکی، به صف اصلی منتقل کن.

saed2006
پنج شنبه 16 اردیبهشت 1389, 17:06 عصر
مسئله به این سادگی که شما میگین نیست
شما به متد های ساختمان داده صف توی C#‎ نگاه بندازین
ببینید با متد های موجود میتونید همچین الگوریتمی رو پیاده سازی کنید یا نه

mohsensaghafi
جمعه 17 اردیبهشت 1389, 15:18 عصر
سلام دوست عزیز.
الگوریتمی که من گفتم متد خاصی نداره. در واقع هیچ متد خاصی نداره. فقط deQueue هست و EnQueue . این دوتا رو هم فکر کنم تمام کلاسهای صف داشته باشن. من سدوکود یکی از تابع ها رو برات می نویسم بعدیش رو مطمئنا خودت می تونی در بیاری.

MoveBack(QueueItmType item){

Queue Q // your Queue
Queue Q1 // Temp Queue


QueueItemType T, T1;

T=Q.deQueue();
while(T.data!=item.data){
Q1.EnQueue(T);
T=Q.deQueue();
}

// Find the Item in the Queue.

T1=Q.deQueue();
Q1.enQueue(T1);

Q1.enQueue(T);
// exchange the item with its back item.
// you can change it with next item.
// but must change a bit into the previous while.


while(!Q.isEmpty()){
T=Q.deQueue();
Q1.enQueue(T);
}


// now the correct order is in Q1.
// Must to chang it to Q.

while(!Q1.isEmpty()){
T=Q1.deQueue();
Q.enQueue(T);
}

باز هم اگر جایی مشکلی داشتی بگو تا بیشتر توضیح بدم.

mohsensaghafi
جمعه 17 اردیبهشت 1389, 22:19 عصر
MoveFront(QueueItmType item){

Queue Q // your Queue
Queue Q1 // Temp Queue


QueueItemType T1, T2;

T1=Q.deQueue();
T2=Q.deQueue();
while(T2.data!=item.data){
Q1.EnQueue(T1);
T1=T2;
T2=Q.deQueue();
}

// Find the Item in the Queue.

Q1.enQueue(T2);
Q1.enQueue(T1);


// exchange the item with its Next item.



while(!Q.isEmpty()){
T1=Q.deQueue();
Q1.enQueue(T1);
}


// now the correct order is in Q1.
// Must to chang it to Q.

while(!Q1.isEmpty()){
T=Q1.deQueue();
Q.enQueue(T);
}