C++ এ সার্কুলার বাফারের উদাহরণ

C E Sarkulara Bapharera Udaharana



বৃত্তাকার বাফার বা বৃত্তাকার সারি হল সাধারণ সারির উন্নত সংস্করণ যেখানে শেষ সূচক এবং টেল সূচক একটি বৃত্তাকার কাঠামোতে সংযুক্ত থাকে। C++ এ সার্কুলার বাফার দুটি পদ্ধতি অনুসরণ করে: enqueue() এবং dequeue()। আমরা এই পদ্ধতির উপর ভিত্তি করে বৃত্তাকার বাফার বা বৃত্তাকার সারি অপারেশন সম্পাদন করি।

  • enqueue() পদ্ধতি বাফার ভরা হয়েছে কিনা তা পরীক্ষা করে। অন্যথায়, যাচাই করুন যে শেষ সূচকটি শেষ। যদি তাই হয়, তাহলে পুচ্ছের মান 0 এ সেট করুন। যদি না হয়, তাহলে সেই সূচকের মান দ্বারা টেলের মান বাড়ান।
  • dequeue() ফাংশন বৃত্তাকার সারিতে সামনের সূচক থেকে মান নেয়। সারি খালি থাকলে, একটি বার্তা সেই খালি সারিটি প্রদর্শন করবে। অন্যথায়, এটি শেষ মানটি পায় এবং সারি থেকে মুছে দেয়।

C++ এ একটি সার্কুলার বাফার বাস্তবায়নের প্রোগ্রাম

উল্লিখিত দুটি পদ্ধতি অনুসরণ করে, আমরা C++ এ সার্কুলার বাফার বাস্তবায়ন করি। আসুন C++ এ বৃত্তাকার সারি বাস্তবায়নের জন্য সমস্ত পদক্ষেপ বিবেচনা করি।







#include

নামস্থান std ব্যবহার করে;

struct MyQueue

{

int মাথা , লেজ ;

int Qsize;



int * NewArr;



মাইকিউ ( int no ) {



মাথা = লেজ = -1 ;

Qsize = size;

NewArr = new int [ s ] ;

}



অকার্যকর সারি ( int val ) ;



int deQueue ( ) ;



অকার্যকর প্রদর্শন সারি ( ) ;



} ;



কোড দিয়ে শুরু করে, আমরা প্রথমে হেড এবং টেইল ভেরিয়েবল শুরু করার জন্য 'MyQueue' struct তৈরি করি। হেড ভেরিয়েবল সামনের সূচকগুলিকে প্রতিনিধিত্ব করে এবং লেজটি একটি অ্যারের পিছনের সূচকগুলিকে উপস্থাপন করে। এর পরে, বৃত্তাকার সারির আকার, পরিবর্তনশীল 'Qsize' দ্বারা চিহ্নিত করা হয়, সংজ্ঞায়িত করা হয়।



তারপর, আমরা 'NewArr' এর গতিশীলভাবে বরাদ্দকৃত অ্যারেটি সংজ্ঞায়িত করি যা বৃত্তাকার সারির মানগুলি সংরক্ষণ করে। এরপরে, আমরা MyQueue() কে কল করি যা একটি কনস্ট্রাক্টর এবং বৃত্তাকার সারি আকারের জন্য 'sz' প্যারামিটারটি পাস করে। MyQueue() কনস্ট্রাক্টরের ভিতরে, আমরা হেড এবং টেইল পয়েন্টারগুলিতে '-1' মান নির্ধারণ করি। এই নেতিবাচক মান নির্দেশ করে যে সারিটি এখন খালি। এগিয়ে চলুন, আমরা 'sz' মান নির্ধারণ করি যা বৃত্তাকার সারির আকারকে প্রতিনিধিত্ব করে। 'NewArr' বৃত্তাকার সারি নির্দিষ্ট 'sz' আকারের মধ্যে পূর্ণসংখ্যার অ্যারে তৈরি করতে একটি নতুন কীওয়ার্ড দিয়ে সেট করা হয়েছে।





তারপর, আমরা enQueue() এবং dequeue() ফাংশন সংজ্ঞায়িত করি। enqueue() লেজ থেকে সংজ্ঞায়িত বৃত্তাকার সারিতে মান সন্নিবেশ করায়। যাইহোক, বৃত্তাকার সারির মাথার উপাদানগুলি dequeue() ফাংশন দ্বারা নির্মূল করা হয়। showQueue() সদস্য ফাংশন বৃত্তাকার সারির মান প্রদর্শন করে।

ধাপ 1: একটি বৃত্তাকার বাফারে উপাদান সন্নিবেশ করার জন্য একটি ফাংশন তৈরি করুন



আগের ধাপে, আমরা একটি ক্লাস সেট করেছি যেখানে প্রাইভেট মেম্বারদের ইনিশিয়ালাইজ করা হয়েছে এবং প্রাইভেট মেম্বার ফাংশন সার্কুলার কিউ বাস্তবায়নের জন্য সেট করা আছে। এখন, আমরা বৃত্তাকার সারি তৈরি করার জন্য ফাংশন সেট করি এবং অ্যালগরিদম ব্যবহার করে বৃত্তাকার সারির ভিতরে মান সন্নিবেশ করি।

অকার্যকর MyQueue::enসারি ( int val )

{

যদি ( ( মাথা == 0 && লেজ == কিউসাইজ - 1 ) || ( লেজ == ( মাথা - 1 ) % ( কিউসাইজ - 1 ) ) )

{

cout << ' \n সারি ভর্তি' ;

ফিরে ;

}



অন্য যদি ( মাথা == - 1 )

{

মাথা = লেজ = 0 ;

NewArr [ লেজ ] val;

}



অন্য যদি ( লেজ == কিউসাইজ - 1 && মাথা ! = 0 )

{

লেজ = 0 ;

NewArr [ লেজ ] val;

}



অন্য {

লেজ ++;

NewArr [ লেজ ] val;

}

}

এখানে, আমরা 'MyQueue' ক্লাস থেকে 'enqueue()' ফাংশনটিকে বৃত্তাকার সারিতে উপাদান সন্নিবেশ করার জন্য কল করি যদি সারিটি খালি বা আন্ডারফ্লো থাকে। 'এনকিউ()' ফাংশনটি 'ভাল' প্যারামিটার দিয়ে পাস করা হয় এবং বৃত্তাকার সারির লেজ থেকে মান সন্নিবেশ করা হয়। এর জন্য বৃত্তাকার সারিতে মান সন্নিবেশ করার জন্য আমরা 'if-else' শর্ত সেট করি। প্রথম “if” স্টেটমেন্ট যা “if (((head == 0 && tail == Qsize – 1) || (tail == (head – 1) % (Qsize – 1)))” মাথাটি কিনা দুটি শর্ত চেক করে শুরুর অবস্থানে এবং লেজটি বৃত্তাকার সারির শেষ অবস্থানে। তারপরে, এটি মাথার অবস্থানের পিছনে লেজটি এক অবস্থানে আছে কিনা তা পরীক্ষা করে। যদি এই শর্তগুলির মধ্যে কোনটি পূরণ করা হয়, তাহলে সারিটি খালি থাকে না এবং প্রম্পট বার্তাটি তৈরি করে।

এর পরে, আমাদের কাছে 'অন্য-যদি' শর্ত রয়েছে যা শনাক্ত করে যে সারিটি খালি কিনা। যদি তাই হয়, মানটি সারিতে ঢোকানো হয়। যেহেতু মাথাটি -1 এর সমান রাখা হয়েছে, এটি দেখায় যে সারিটি খালি এবং বৃত্তাকার সারিতে মানটি সন্নিবেশ করা প্রয়োজন। এর জন্য, আমরা মাথা এবং লেজের সমান 0 সেট করি। তারপর, আমরা লেজের অবস্থান থেকে 'NewArr' বৃত্তাকার সারিতে মান সন্নিবেশ করি।

তারপরে, আমাদের তৃতীয় 'অন্যথা হলে' শর্ত রয়েছে যা পরীক্ষা করে যে লেজটি সারির শেষ অবস্থানে রয়েছে এবং মাথাটি সারির শুরুর অবস্থান নয়। এই শর্তটি প্রযোজ্য হয় যখন লেজটি শেষ পর্যন্ত পৌঁছায় এবং শুরুর অবস্থানে এখনও স্থান থাকে। এর জন্য, আমাদের মাথাটি 0 এ সেট করতে হবে এবং লেজের অবস্থান থেকে উপাদানটি যোগ করা হয়েছে। সবশেষে, প্রদত্ত সমস্ত শর্ত পূরণ না হলে, সারিটি খালি বা পূর্ণ নয়। এই ক্ষেত্রে, আমরা লেজটিকে 1 দ্বারা বৃদ্ধি করি এবং নতুন পুচ্ছ অবস্থান থেকে মান যোগ করা হয়।

ধাপ 2: সার্কুলার বাফার থেকে উপাদান মুছে ফেলার জন্য একটি ফাংশন তৈরি করুন

আমরা enqueue() ফাংশন ব্যবহার করে বৃত্তাকার সারিতে উপাদানগুলি তৈরি এবং সন্নিবেশ করার জন্য পূর্ববর্তী কোড সেট করি। এখন, আমরা বৃত্তাকার বাফার থেকে উপাদান অপসারণের বাস্তবায়ন সংজ্ঞায়িত করি যদি এটি ওভারফ্লো হয়।

int MyQueue::deQueue ( )

{

যদি ( মাথা == - 1 )

{

cout << ' \n সারি বিনামূল্যে' ;

ফিরে INT_MIN;

}



int MyData = NewArr [ মাথা ] ;

NewArr [ মাথা ] = -1 ;



যদি ( মাথা == লেজ )

{

মাথা = -1 ;

লেজ = -1 ;

}



অন্য যদি ( মাথা == কিউসাইজ - 1 )

মাথা = 0 ;



অন্য

মাথা ++;



ফিরে আমার তথ্য;



}

প্রদত্ত কোডে, হেড ইনডেক্স থেকে এলিমেন্ট অপসারণের জন্য আমরা 'Myqueue' ক্লাস থেকে dequeue() ফাংশনকে কল করি। সুতরাং, আমাদের কাছে 'if' বিবৃতি রয়েছে যা সারিটি খালি কিনা তা পরীক্ষা করে। মাথাটি '-1' মান দিয়ে সেট করা হয়েছে যা খালি সারির প্রতিনিধিত্ব করে। বার্তাটি তৈরি হয় যে সারিটি খালি এবং তারপরে INT_MIN ফেরত দিন যা একটি int-এর জন্য ধ্রুবক সর্বনিম্ন মান। 'যদি' বিবৃতি নির্ধারণ করে যে সারিটি খালি আছে কিনা। এর জন্য, আমরা 'MyData' ভেরিয়েবলটি সংজ্ঞায়িত করি এবং সারির মাথায় উপাদানটির মান সেট করি। তারপর, আমরা মাথাটি -1 অবস্থানে সেট করি যা নির্দেশ করে যে এই মানটি সারি থেকে সরানো হয়েছে। এর পরে, আমরা মাথা এবং লেজ সমান কিনা তা পরীক্ষা করি। যদি উভয়ই সমান হয়, আমরা খালি বৃত্তাকার সারির প্রতিনিধিত্ব করে উভয়ের জন্য '-1' মান নির্ধারণ করি। সবশেষে, হেড কিউয়ের শেষ সূচকে থাকলে dequeue() কাজ করে কিনা তা আমরা পরীক্ষা করি। এর জন্য, আমরা এটিকে '0' এর মান দিয়ে সেট করি যা অ্যারের শুরুতে লুপ করে। যদি প্রদত্ত শর্তগুলির কোনটিই সত্য না হয়, তাহলে মাথার মান বৃদ্ধি করা হয় এবং সারিবদ্ধ উপাদানটি ফেরত দেওয়া হয়।

ধাপ 3: সার্কুলার বাফারের উপাদানগুলি দেখানোর জন্য একটি ফাংশন তৈরি করুন

এই বিভাগে, আমরা 'NewArr' বৃত্তাকার সারির উপাদানগুলি প্রদর্শন করতে showQueue() ফাংশনকে কল করি।

অকার্যকর MyQueue::showQueue ( )

{

যদি ( মাথা == - 1 )

{

cout << ' \n সারি বিনামূল্যে' ;

ফিরে ;

}



cout << ' \n বৃত্তাকার সারি উপাদান: ' ;



যদি ( লেজ > = মাথা )

{

জন্য ( int i = মাথা ; i < = লেজ ; i++ )

cout << NewArr [ i ] << '' ;

}



অন্য

{

জন্য ( int i = মাথা ; i < Qsize; i++ )

cout << NewArr [ i ] << '' ;



জন্য ( int i = 0 ; i < = লেজ ; i++ )

cout << NewArr [ i ] << '' ;

}

}

সারির খালি অবস্থা প্রথমে যাচাই করা হয়। একটি ইঙ্গিত যে বৃত্তাকার সারি বিনামূল্যে প্রদর্শিত হয় যদি সারি বিনামূল্যে হয়। অন্যথায়, ফাংশনটি বৃত্তাকার সারির উপাদানগুলি দেখাবে। এই জন্য, আমরা 'if' বিবৃতিটি সংজ্ঞায়িত করি যেখানে আমাদের লেজ আছে যা মাথার চেয়ে বড় বা সমান। বৃত্তাকার সারি সম্পূর্ণ না হলে এই শর্তটি কেস পরিচালনা করার জন্য সেট করা হয়৷

এই ক্ষেত্রে, আমরা মাথা থেকে লেজ পর্যন্ত পুনরাবৃত্তি করতে এবং বৃত্তাকার সারির মানগুলি প্রিন্ট করতে 'for' লুপ ব্যবহার করি। পরবর্তী ক্ষেত্রে যেখানে বৃত্তাকার সারি সম্পন্ন হয়। এর জন্য, আমরা 'if' শর্তটি ব্যবহার করে পরীক্ষা করি যেখানে লেজটি মাথার চেয়ে কম। তারপরে, আমাদের দুটি লুপ ব্যবহার করতে হবে যেখানে প্রথমটি মাথা থেকে সারির শেষ পর্যন্ত পুনরাবৃত্তি করে এবং দ্বিতীয়টি পুচ্ছের শুরু থেকে পুনরাবৃত্তি করে।

ধাপ 4: সার্কুলার কিউ প্রোগ্রামের প্রধান() ফাংশন তৈরি করুন

সবশেষে, আমরা প্রোগ্রামের main() ফাংশন তৈরি করি যেখানে আমরা বৃত্তাকার সারিতে পাঁচটি পূর্ণসংখ্যা সন্নিবেশ করি এবং সারির পূর্ণসংখ্যা প্রদর্শন করি। এর পরে, আমরা dequeue() ফাংশন কল করে বৃত্তাকার সারি থেকে মুছে ফেলা পূর্ণসংখ্যা দেখাই। কয়েকটি উপাদান সারিবদ্ধ করার পরে, আমরা enqueue() ফাংশন ব্যবহার করে নতুন উপাদান সন্নিবেশ করে আবার সারি পূরণ করি।

int প্রধান ( )

{

MyQueue যে ( 5 ) ;



// উপাদান সন্নিবেশ করান ভিতরে বৃত্তাকার সারি

que.enসারি ( এগারো ) ;

que.enসারি ( 12 ) ;

que.enসারি ( 13 ) ;

que.enসারি ( 14 ) ;

que.enসারি ( পনের ) ;



// উপস্থিত উপাদান প্রদর্শন ভিতরে বৃত্তাকার সারি

que.showQueue ( ) ;



// সার্কুলার কিউ থেকে উপাদান মুছে ফেলা হচ্ছে

cout << ' \n মুছে ফেলা উপাদান = ' << que.deQueue ( ) ;

cout << ' \n মুছে ফেলা উপাদান = ' << que.deQueue ( ) ;



que.showQueue ( ) ;



que.enসারি ( 16 ) ;

que.enসারি ( 17 ) ;

que.enসারি ( 18 ) ;



que.showQueue ( ) ;



ফিরে 0 ;



}

আউটপুট:

বৃত্তাকার সারি বাস্তবায়নের ফলাফল C++ প্রম্পট স্ক্রিনে দেখানো হয়েছে।

উপসংহার

উপসংহারে, এই নিবন্ধে বৃত্তাকার বাফার বিষয় গভীরভাবে ব্যাখ্যা করা হয়েছে। আমরা প্রথমে বৃত্তাকার বাফার তৈরি করেছি, তারপর বৃত্তাকার সারি থেকে কীভাবে মুছে ফেলা যায় তা ব্যাখ্যা করেছি, এবং তারপর C++ এ সার্কুলারের উপাদানগুলি প্রদর্শন করেছি।