الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

pop and push in linked list

مغلق
بدأه Mrs.n في 21 أكتوبر 2004 · 19 رد · 2,312 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

كيفكم

اليوم ان بطلب منكم شرح كيف نعمل pop و push في linked list

وطبعا لازك ننتاكد كل مره isempty or isfull

انا عندي مثلا المدخل

2 3 4 +-

نعمل push لكل الارقام حتى نوصل لعلامة + ونعمل pop بعدها 4 و 3 نجمعها ونتاج

نعمل له push

وهكذا

ممكن شرح لكيفة عمل ذالك

#2

هنا بعض المحاولات ادري انها غلط

بس لاني مو فاهم البرنامج ومو عارف فكرته عشان اعمله

اتمنى تساعدوني فيه في اقرب فرصه

ولكم جزيل الشكر مني

#include <iostream>
#include <cstring>
#include <cstdio>
#include <conio.h>
#include <cstdlib>
#include <ctype.h>
using std::cout;
using std::cin;
using std::endl;

struct NodeRec
{
	char eval;
	NodeRec* next;
};
void read(NodeRec* a);
void puch(NodeRec* a,NodeRec* top);
void pop(NodeRec* a,NodeRec* top);
int ans(NodeRec* a);
void main ()
{
	NodeRec* node;
	//NodeRec* curn;
	NodeRec* top;
	top=NULL;
	//curn=node;

	node=new NodeRec; 
	read(node);
  cout<<node->eval;

/*	while(curn->next !=NULL)
	{
	cout<<curn->eval;
	curn=curn->next;
	}*/
	getch();
}
//----------fun read-------------------------
void read(NodeRec* a)
{
	NodeRec* temp;
    NodeRec* curn;
	a=NULL;


	char ans;
	cout<<"you whant add any think  Y/N:  ";
	cin>>ans;

  do
	{
  temp= new NodeRec;
     curn=a;
   cout<<" enter your ch:  ";
  
   cin>>temp->eval;
   temp->next=NULL;
   if (a==NULL)
   {

   
     a=temp;
   }
   else
   {
  while(curn->next!=NULL)
 	 curn=curn->next;
  curn->next=temp;
   }
    cout<<"you whant add any think  Y/N:  ";
	cin>>ans;
	}	while(ans=='Y' || ans=='y');
}
//----------------fun puch---------------------------
void puch(NodeRec* a,NodeRec* top)
{
   

	if(a!=NULL)
	{
  a->next=top;
     top=a;
	}
	else 
  cout<<"is full";

}
//------------fun top-------------------------------
void pop(NodeRec* a,NodeRec* top)
{
	if(top==NULL)
  cout<<"NO NODE";
	else
	top=top->next;

}
//--------------fun ans--------------------------
int ans(NodeRec* a)
{

اخر fun طبعا اففكره مو فاراسي وفيها وهي اللي تعمل

انا عندي مثلا المدخل

2 3 4 +-

نعمل push لكل الارقام حتى نوصل لعلامة + ونعمل pop بعدها 4 و 3 نجمعها ونتاج

نعمل له push

وهكذا

#3

ممكن اللقى شرح للفكره

حتى استطيع تطبيقها والعمل على البرنامج

واكماله

#4

السلام عليكم ورحمة الله وبركاته

اختي الكريمة هناك اكثر من طريقه للحل فكل ما عليكي فعله هو رسم صوره في مخيلتك للبرنامج فمثلا ((يكون عندك لست تضعين فيها المدخلات وبعد ذلك يبدأ التعامل مع الستاك وفق شروط تحددينا في (main) فقبل ارسالك العنصر الى الستاك تتأكدين من طبيعته فلو كان (operator)ستنادين البوب ....

والبرنامج الذي اضفته في المنتدى (stck&queue)هو يتعامل مع لنك لست وكل ما عليك عمله هو اخذ الجزء الخاص بالstack وفي داخل (main)

تنشأين اوبجكت للستاك واوبجيكت لللست

تدخلين العناص الى اللست اولا ثم تدخلين في لوب (بشرط ان كان العنصر عدد يعمل بوش واذا كان عمليه يعمل بوب

اتمنى ان تكوني قد فهمتي ما اقصد واعذريني على التقصير فقد اخذت هذا المقرر منذ فتره طويله ومشاغل الدراسه والواجبات تنسي الانسان الكثير من الامور ... فانا احس بشعورك

في حالت اذا صعب عليكي الامر هذا ايميل استاذ لدينا في الجامعة ان شاء الله سيفيدك

eid@qu.edu.qa

او اذخلي على هذا الموقع الخاص بجامعه قطر (قسم العملي -> datastructer)

وهذا ملف مرفق فيه برنامج كامل لللنك لست اتمنى ان يفيدك

وفقنا الله واياكي لما فيه خير

DEL_LIST.CPP

#5

مشكوره اختي على الشرح

بس انا سؤالي كيف اخلي يعمل بوب لخانتين للخلف

ويجمع ناتجها ويعمل بوش بعدها للناتج

يعني اعمل اكثر من مؤشر

؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

وانا استفدت من اللي كتبته من موضوعك الاول بس المشكله هي المذطوره فوق

ا

#6

السلام عليكم

تسمى هذه الطريقة في كتابة المعادلة الحسابية RPN expresion(Reverse Polish Notation)

حيث نقو بكتابة المعاملات operands ثم كتابة الoperators :

فمثلا لو اردنا حساب قيمة العملية الحسابية 2*6

فاننا سندخل العمليةعلى الصورة : 6 ثم 2 ثم *

وتتلخص طريقة عمل البرنامج بأن يقوم البرنامج بعد ادخال المعادلة بفحص المتغير فاذا كان operator(رقم) يقوم باضافته الى الsatck عن طريق الدالة push واذا كان operand (+,-,..)

يقوم بعمل pop لاخر قيميتن تم تخزنهما بالstack ويجري العملية الحسابية عليهما وثم يدخل ناتج العملية الى الstack

مثال للتوضيح:

9 2 1 + / 4 *
بفرض متغير token 

token=9   push 9 

token=2   push2 

token=1   push1 
token=+   pop 1  pop 2 push 3 

token=/  pop 3  pop 9 push 3(result) 
token=4   push4 
token=*    pop4   pop3   push12

أرجو أن أكون قد أوضحت لك الصورة ..

تم تعديل هذه المشاركة بواسطة مبرمجة فلسطينية في 23 أكتوبر 2004 في 01:30

#7

مبرمجه

مشكوووووووووووووووووووووره

بس مافهمت

ابي شرح الفكره اللي قلتيها على لينكد ليتس كيف اقل ل خذ ارقمين اللي قبل الاشاره اعمل عليها العكلية الاشاره وضع ناتجهم بدالهم

لانه فعلا هذا اللي ابغاه

#8

السلام عليكم

هذا البرنامج يقوم بايجاد ناتج الRPN expression عن طريق الStack

#include <iostream.h>
#include<conio.h>
#include<stdlib.h>

const size=100;
 class Stack
  {
  private:
  int mytop;
  int myarray[size];
    public:

 Stack()
{
mytop=-1;
}

int empty()
{
   if(mytop==-1)
       return 1;
   else
      return 0;
      }

void push(int value)
{
   if(mytop<size-1)
   {
     mytop=mytop+1;//++mytop;
     myarray[mytop]=value;
     }
      else
	cout<<"The stack is full";
	}
void display();

int top_val()
{
    return myarray[mytop];
    }

void pop()
{
   if(!empty())//mytop>=0;
       mytop--;
     else
       cout<<"The stack is empty";
       }
	};
   void Stack::display()
   {
  for(int i=mytop; i>=0;i--)
    cout<<myarray;
    }


void main()
  {
  char RPN[20];
  Stack num;
       char token;

  int y;
  float result;
  char temp[1];
 int i=0;
   cout<<"Enter the expression";
     cin>>RPN;
   do
  {
      token=RPN;
      i++;

   if(token!='+' && token!='-' && token!='*' && token!='/' )
     {
       temp[0]=token;
       y=atoi(temp);
       num.push(y);
       }
       else


     {
       int no2=num.top_val();
       num.pop();
       int no1=num.top_val();
       num.pop();
       switch(token)
       {
       case'+': result= no2+no1;
       break;
       case'-':result= no2-no1;
       break;
       case'*':result= no2*no1;
       break;
       case'/':result= no2/no1;
       break;

       }


       num.push(result);
     }
     cin>>RPN;
     }while(RPN!='$');
     cout<<"The result is: " <<num.top_val();
      getch();
      }
#9

مشكوره اختي

بس انا ابغاه على linked list

struct NodeRec
{
char eval;
NodeRec* next;
};

يعني تكون محفوظه في الذاكره بصيغه عشوائيه ورابط بينها هو مؤشر اسمه next

#10

سأقوم بشرح النقاط التي رأيت انها تحتاج للشرح بالبرنامج :

ندخل المعادلة ونخزنها في مصفوفة ،مع ملاحظة وضع مسافة بين كل مدخل ووضع اشارة $ عند نهاية المعادلة ،حيث سيدخل القيم الى المصفوفة باستمرار ويتوقف عند اشارة $

ندخل المعادلة على الشكل:

24 2 1 + / 4 * $

--------------------------------------------------------------------

يأخذ المتغير token قيم المصفوفة بالتتابع

token=RPN;
     i++;

--------------------------------------------------------------------

سنفحص هنا المتغير اذا لم يكن operand (اي سيكون رقم أو معامل operator)

if(token!='+' && token!='-' && token!='*' && token!='/' )
    {
      temp[0]=token;
      y=atoi(temp);
      num.push(y);
      }

الدالة atoi ستقوم بتحويل المتغير من string الى قيمة رياضية (int ,float,......) ،لنستطيع اجراء العمليات الحسابية عليها ،هنا سنحولها الى int

ثم سنقوم بعمل push للقيمة داخل الstack .

--------------------------------------------------------------------

else
    {
      int no2=num.top_val();
      num.pop();
      int no1=num.top_val();
      num.pop();
      switch(token)
      {
      case'+': result= no2+no1;
      break;
       case'-':result= no1-no2;
      break;
      case'*':result= no2*no1;
      break;
      case'/':result= no1/no2;  
      break;

      }


      num.push(result);
    }

اذا كانت operator (=,-,*,/) ،نعمل pop لاخر قيميتن من الstack ونجري عليهما العملية الحسابية سواء كانت ضرب او قسمة او طرح او جمع ،مع ملاحظة ترتيب المعاملات عند القسمة والطرح حيث سنطرح الرقم الذي اخرجناه من الstack اولا من الرقم المخرج بعده

ثم نقوم بادخال الناتج للstack .

--------------------------------------------------------------------

#11

على حسب علمي فان الpop وال push هي العمليات الاساسية في الstack ،

المهم اني شرحت لك الفكرة وانت طلبت شرحها ،اما الكود فتستطيع كتابته بسهولة متى ما فهمت الفكرة والطريقة لعمل البرنامج ...

#12

مشكووووووووووووووووووره

وماقصرتي

بس مشكلتي انا كيف اعمل بوب لخانتن في لينكد ليتس كيف اخليه يرجع على ورى

انا اعرف امشيه بس معرف ارجعه للخلف

في داله اي شي ترجعه

#13

حسب ما فهمت منك ان المشكلة تكمن في العودة للست الذي قبله

هذا رسم توضيحي يبين الطريقة المثلى للسير في Linked List بأتجاهين

لاحظي ان nod و Temp هما مؤشربن (Pointer) و Data متغير الذي يحمل القيم

بالتاكيد يجب عليك انشاء مؤشر او مؤشرين على الاقل للتنقل في Linked List

post-14-1098486599_thumb.gif

#14

مشكوووووووووووووووور

ممكن شوية شرح لرسمه

يعني كيف اطبق كودها

حاولت انا وما عرفت اعمل نفس اللي في ارسمه

ممكن تقلي كيف كودها؟؟؟

#15

ما شاء الله تعاون رائع

يسر النفس ويبهجها

الاخت مبرمجه فلسطينيه جزاكي الله خير

فجهدك واضح في الاوانه الاخيره

لكم مني خالص التقدير

*********************

دروس الاكسس

قاعدة بيانات بالسي++

قاعدة بيانات اخرى بالسي++

الفريق العربي للبرمجه

*********************

كان الله في عون العبد مادام العبد في عون اخيه

#16

إن شاء الله يكون اعطيك الكود غدا لانه بصراحة طويل وغير موجود على الجهاز الذي اعمل عليه حاليا ....

ساقوم بنقله من جهازي واحاول ربطه بالصورة ...

#17

السلام عليكم

ما ذكره الاخ a_g9999 يسمى double linked list وطريقة برمجته سهله, ماعليكى إلى ان تقومى بوضع مؤاشرين فى كل عنصر :

NodeRec* next
NodeRec* prev

وبعد ذالك تقومى بإستخدام المؤشر الاول ليشير إلى العنصر التالى, ومن العنصر التالى تشيرى بالمؤشر الاخر prev على ما سبقه.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#18

مشكورين

وانتظرك يا اخ a_g9999 غدا لانه التسليم يوم الاحد وفيه اختبار ايضا على البرنامج

احمد غريب اشكر مرورك

واشكرك على شرحك المبسط ربما مستوى دراسي لم ادرس double linked list يادوب

في لينكد ليتس ونتعلم نربط بينها بمؤشر واحد فبتكون الفكره شوي يبغاله مجهود مني ومنكم عشان استوعبها وعشان اقدر اربط مؤشرين مو مؤشر واحد

فياريت تساعدوني

وبكون شكر لكم وتقبلوا مني دعواتي لكم

#19

السلام عليكم

شكرا لك أخي عبد الهادي على التشجيع ...

واعتذر منكم فلم انتبه للسؤال أنه على الlinked list ،ولم أقم بقراءة الكود الذي وضعته الاخت، اعتذر منكم جميعا ،فقد احببت المساعدة

وجزاكم الله خيرا...

#20

اختي مبرمجه لا تعتذر على المساعده

انتي حاولتي تساعدني واشكرك على مساعدتك

واهتمامك

اقرئي ردودك كنتي تحاولا تساعدني باي طريقه

فتقبلي اعتذاري انا

هذا الموضوع مغلق.

مواضيع مشابهة