PDA

View Full Version : حرفه ای: پیاده سازی Queue (صف) به صورت سی ++ در سی شارپ



ali.khoban
جمعه 20 بهمن 1391, 05:43 صبح
سلام دوستان

میشه لطفا یکی بگه مشکل این کد چیه؟

تو سی ++ مینویسم کاملا درسته ولی تو سی شارپ به Front و Rear و مهم تر از همه به node گیر میده و زیر هرچی node هست حتی وقت تعریف ساختمان قرمز میکنه.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace Queue
{
public partial class Form1 : Form
{

struct node
{
public int value;
public string text;
public node* next;
}

node* front = null;
node* rear = null;

public Form1()
{
InitializeComponent();
}

private void addq(int value,string text)
{
node* q = new node();

q->value = value;
q->text = text;
q->next = null;

if (rear == null)
{
rear = q;
front = q;
}
else
{
rear->next = q;
rear = q;
}
}
}
}



ارورشم اینه


Pointers and fixed size buffers may only be used in an unsafe context


برنامم قراره شماره و نام اشخاص رو بگیره و در صف قرار بده و بعدا طبق صف یکی یکی نمایش و حذفشون کنه.
روش های دیگم دیدم اما توشون فقط عدد و بعدی رو میگرفت و نمیشد رشته هم تعریف کرد.

روش های زیر رو تست کردم ولی فقط عدد میگیرن و یه مشکل دیگه دارن که مثه روش بالا حالت ساختمان مانندی ندارن و تو سرچ کاربر اذیت میشه چون بالا وقت پیمایش تا به آیتم مورد نظر برسه فقط لازمه Text رو چاپ کرد.


Queue<int> q = new Queue<int>();

یا


ArrayList lst = new ArrayList();



لطفا راهنماییم کنین.

ممنونم

plus
جمعه 20 بهمن 1391, 06:04 صبح
دوست عزیز در #C به طور پیشفرض امکان استفاده از pointer ها نیست.شما فقط میتونید در بلاک هایی که با unsafe مشخص میکنید از pointer استفاده کنید.MSDN (http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.80).aspx)
بجای استفاده از pointer و پیاده سازی صف، همون کلاس Queue که گفتین مناسب هست.منتها فقط عدد نمیگیره.کلاس Queue یک کلاس Generic هست. یعنی شما موقع تعریف بر اساس Type ی که مشخص میکنید یک صف از اون نوع درست میکنید.

struct Student
{
public int value;
public string text;
}
..
..
Queue<Student> studentQueue = new Queue<Student>();

با متد Enqueue میتونید یک شی رو به انتهای صف اضافه کرد و با Dequeue شی از ابتدای صف برداشت.

Student student = new Student();
student.value = 2;
student.Text = "Hello!";
studentQueue.Enqueue(student);
..
..
Student output = studentQueue.Dequeue();
MessageBox.Show(output.Text);

و البته از اونجا که Queue از نوع IEnumerable هست، متدهای زیادی رو برای فیلتر(Where) و پیمایش و انتخاب آیتم و... به شما میده.اصلا نیازی به پیاده سازی دوباره صف ندارین.

Mahmoud.Afrad
جمعه 20 بهمن 1391, 16:29 عصر
اصلا چرا صف؟!! نوع استفاده شما چیه که میخوای از صف استفاده کنی؟ صرفا ذخیره و جستجو، در اینصورت استفاده از صف اشتباهست؟
اگر بین استفاده از Queue و ArrayList مردد هستی یعنی دنبال راه بهتری هستی ، بهتره برای این کار بی خیال هر دو بشی و به جاش از List استفاده کنی:

class node
{
public int value;
public string text;
}

List<node> students = new List<node>();


مثال برای اضافه کردن:

node student1 = new node() { text = "a", value = 100 };
students.Add(student1);

node student2 = new node() { text = "b", value = 200 };
students.Add(student2);


از طریق اندیس میتونی به اطلاعات دسترسی داشته باشی:
students[0].text

برای جستجو از طریق text هم به طریق زیر عمل کن. text که دنبالش هستی رو در textForFind بریز و از طریق متد find پیداش کن و بعد ازش استفاده کن:

string textForFind = "a";
node result = students.Find(delegate(node n)
{
if (n.text == textForFind)
return true;
else
return false;
}
);

if (result != null)
{
// use result
MessageBox.Show("node found. value is : " + result.value + " index is :" + students.IndexOf(result));
}


میتونی از طریق متدهای students حذف و اضافه و ... در لیست رو انجام بدی.