Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash - bet 33

|
Tiplarni dinamik tarzda aniqlash. Reja: Tiplarni dinamik tarzda aniqlash
|
bet | 33/143 | Sana | 20.07.2024 | Hajmi | 0,81 Mb. | | #268096 |
Bog'liq Tiplarni dinamik tarzda-fayllar.org4.1- dasturda til semantikasi talabi bo‘yicha tahrirlarni qilib navbat uchun deyarli o‘zgarishsiz qoldiramiz va 4.2 dasturni olamiz.
4.2-dastur. Navbat sinfining funksiyalari.
// Created by MBBahodir #include "stdafx.h"
#include #include #include #include #include using namespace std;
int main() {
queue st, st_one, st_two; queue> vst;
vst.emplace("str1"); vst.emplace("str2"); vst.push("eostr");
for (int i=0; i<5; ++i) st.push(i);
for (int i = 0; i < 15; i++) st_one.emplace(i*10); st_two = st;
st.swap(st_one);
cout << st.size() << " " << st_one.size() << " " << st_two.size() << " " << vst.size() << endl;
while (!vst.empty()) {
cout << vst.front() << " : stack dagi oʻrni " << vst.size() << endl; vst.pop();
}
int size = st.size(); while (size--) {
cout << st.front() << " : stack dagi oʻrni " << st.size() << endl; st.pop();
}
|
while (st.size() != 0){
cout << st_two.front() << " : stack dagi oʻrni " << st_two.size() << endl; st_two.pop();
}
while (!st.empty()) {
cout << st.front() << " : stack dagi oʻrni " << st.size() << endl; st.pop();
}
cout << st.size() << " " << st_one.size() << " " << st_two.size() << " " << vst.size()
<< endl;
cout << " stack st " << (st.empty() ? "" : "not ") << " empty" << endl; cout << " stack vst" << (vst.empty() ? "" : "not ") << " empty" << endl;
cout << " stack st_one " << (st_one.empty() ? "" : "not ") << " empty" << endl; system("pause");
return 0;
}
|
navbatda pop_front() usuli vektor konteyner ustiga qurib bo‘lmaydi, , lekin uni ro‘yxat konteyner uchun qurish mumkin.
Deque sinfi uchun front(), push_back(), pop_front()), usullari har qanday konteynerlarda ishlatiladi (faqat pop_front() usuli borlarida).
shuning uchun navbat uchun yasaladigan obʻyektda, yaʻni deque sinfida top() usuli o‘rniga front() usuli ishlatiladi.
Maʻlum bir tartibda qayta ishlanishi kerak maʻlumotlarni uchun umumiy maʻlumotlar tuzilishiga asoslangan to‘plami bu – stek va navbatdir (stack, deque). Masalan, biror funksiya o‘z navbatida uchinchi funksiyani chaqiradigan boshqa funksiyani chaqirsa, uchinchi funksiya birinchi funksiyani emas, ikkinchi funksiyaga qaytishi muhimdir.
Bu maʻlumotlarni qayta ishlash tartibini amalga oshirish uchun dasturchi o‘zining navbat funksiyasi tashkil qilish lozim. Stekka qo‘shilgan oxirgi qiymat birinchi bajariladi va aksincha, stekka qo‘shilgan birinchi qiymat oxirgi bajariladi. Shunday qilib, maʻlumotlar tuzilmasining o‘zi chaqirishlarning to‘g‘ri belgilangan tartibda berilishini taʻminlaydi.
Konseptual, maʻlumotlar tuzilishi - stek juda oddiy: u maʻlumotlarni kiritish yoki chiqarish uchun maʻlum bir tartibni belgilaydi Har safar bir element qo‘shiladi, bu stekka yuqori element bo‘lib tugaydi. Stekdan olib tashlanadigan yagona element stekning yuqori qismida joylashgan elementdir. Shunday qilib, stekka “birinchi kirish, oxirgi chiqish — FILO” yoki “oxiri kirish, birinchi chiqish
— LIFO” deb ham aytiladi. Demak, Stekka qo‘shilgan birinchi element undan oxirgi chiqariladi.
Xo‘sh, bu nima? Nima uchun stek kerak? Yuqorida aytib o‘tganimizdek, funksiyalarni (qiymatlarni) chaqirishni tashkil qilish uchun qulay yo‘lidir. Aslida, stek chaqirish (call stack) tez-tez ishlaydigan yoki boshqa funksiyalarning qaytish qiymatini kutayotgan funksiyalar ro‘yxatiga murojaat qilish uchun ishlatiladigan atamadir.
Shuningdek, stek informatika faning fundametntal tilining bir qismidir. Agar birinchi kelib, oxirish ketish tamoyili asosida fikrlasangiz, unda stek terminini ishlatish lozim.
Bundan tashqari, bunday (stek kabi) navbatlar ko‘p jarayonlarda ishtirok etadi, nazariy informatikadan tortib, bunday push-down funksiyalari va juda ham ko‘p bag usullarida.
Stek assosiativ usullarga ega:
Push – stekka element qo‘shish.. Pop – stekdan element o‘chirish Top – elementni ko‘rish.
LIFO - stek xarakati.
FILO - stek xarakati (ekvivalet LIFO ga).
Stack (stek) maʻlumotlar tuzilmasini amalga kutubxona yaratish masalani qaraymiz. Umumlashgan dasturlash usuliga mos keladigan umumiy stack, yaʻni Stack sinfi uchun shablon yaratish degani. Agar shablonlar bilan tanish bo‘lmasangiz, funksiya shablonlariga oid nazariy maʻlumotlarga qarang, shablonlar bilan ishlash mexanizmi batafsil bilish lozim. Agar shablonlar bilan tanish, lekin sinf shablonlari bilan ishlashni unutgan bo‘lsangiz, sinf shablonlari haqida nazariy materiallarni o‘qib o‘rganing.
Bu stack shablonlari bilan amalga oshirildigan kutubxonani deyarli har qanday maʻlumotlar tipi uchun foydalanish mumkin. Bundan tashqari, stack hajmi dastur ijrosi davomida jadal belgilanadi. Stackga qo‘shimcha funksiya ham qo‘shildi peek(), bu stackning yuqori qismidan n- elementini qaytaradi.
4.3-dastur. Stack shablon sinfi
#ifndef STACK_H #define STACK_H
// Created by MBBahodir #include #include
#include
template class Stack{
private:
T *stackPtr; // stackka koʻsatkich
const int size; // stackdagi maksimal elementlar soni
int top; // stackning joriy elementi public:
Stack(int = 10); // stackning joriy holatda elementlar soni 10 ta Stack(const Stack &); // nusxalsh konstruktori
~Stack(); // destruktor
inline void push(const T & ); // elementni stackning yuqori qismiga joylashtirish
inline T pop(); // stack ichidan eng yuqoridagi elementni oʻchirish
inline void printStack(); // stackni ekranga chiqarish
inline const T &Peek(int ) const; // stackning yuqorisidagidam keyingi n-element inline int getStackSize() const; // stack oʻlchamini olish
inline T *getPtr() const; // stackka koʻrsatkich olish inline int getTop() const; // joriy elementni olish
};
// Stack sinfi shablon funksiyalarini realizatsiyz qilish
// konstruktor Steka template
Stack::Stack(int maxSize): size(maxSize) // oʻzgarmaslarni initsalizatsiyalash
{
stackPtr = new T[size]; // xotira ajratish top = 0; // joriy elementno 0 bilan toldirish;
}
|
// nusxalsh konstruktori template
Stack::Stack(const Stack & otherStack) : size(otherStack.getStackSize()) // oʻzgarmaslarni initsalizatsiyalash
{
stackPtr = new T[size]; // yangi xotira ajratish top = otherStack.getTop();
for(int ix = 0; ix < top; ix++) stackPtr[ix] = otherStack.getPtr()[ix];
}
// destruktor template Stack::~Stack()
{
delete [] stackPtr; // ochirish
}
// element qoʻshish template
inline void Stack::push(const T &value)
{
// oʻlchamni oʻzgartirish
assert(top < size); // joriy element soni oʻlchamdan kichik boʻlishi kerak
stackPtr[top++] = value; // elementni joylashtirish
}
// elementni oʻchirish template inline T Stack::pop()
{
// oʻlchamni tekshirish
assert(top > 0); // joriy element 0 katta boʻlishi kerak
stackPtr[--top]; // elementni oʻchirish return 0;
}
// yuqori elementdan n-elementni qaytaradi template
|
inline const T &Stack::Peek(int nom) const
{
//
assert(nom <= top);
return stackPtr[top - nom]; // n-elementni qaytarish
}
// ekranga chiqarish template
inline void Stack::printStack()
{
for (int ix = top - 1; ix >= 0; ix--)
cout << "|" << setw(4) << stackPtr[ix] << endl;
}
// oʻlchamni qaytarish template
inline int Stack::getStackSize() const
{
return size;
}
// koʻrsatkich qaytarish (nusxalash konstruktori uchun) template
inline T *Stack::getPtr() const
{
return stackPtr;
}
// oʻlchamni qaytarish template
inline int Stack::getTop() const
{
return top;
}
#endif // STACK_H
|
Stack shablon sinfi *.h (header) faylda yaratildi. Shablon sinf interfeysi va amalga oshirish ham bir xil faylda bo‘lishi kerak, bo‘lmasa, shunga o‘xshash mazmun bilan xato berishi mumkin.
error undefined reference to "method of a class template»
|
Yaʻni, xatolik, shablon sinf usullari havolalarda aniqsizlik.
Shablon sinf interfeysining fragmentlarida 9 -dan 28gacha yangilandi. Sinfning barcha usullari izohlarni o‘z ichiga oladi va mening fikrimcha, ularning funkiyalarini alohida taʻriflash mantiqiy to‘g‘ri emas. Stack shablon sinfning barcha usullari inline funksiyalari sifatida eʻlon qilinadi. Bu sinf ishini tezlashtirish maqsadida amalga oshiriladi. Sinfning ajralmas funksiyalari tashqi funsiyalarga qaraganda tezroq ishlaydi.
Shablon interfeysidan so‘ng, stack sinf usullari amalga oshiriladi, kutubxona fragmentlarida 32-117gacha yangilandi. Agar stack sinf, shablonlar va sinflar usullarini amalga oshirish haqida bilsangiz shablon sinfni yaratishda murakkab hech narsa yo‘q. Sinfda ikkita konstrkutor bor, birinchisi fragmentning 32-33 qatorlarida - bu standart konstruktor hisoblanadi. Fragmentning 41-50 qatordagi nusxa konstruktor hisoblanadi. Bir obʻyektni boshqasiga nusxalash uchun kerak. Peek usuli (funksiyasi), fragmentning 80-88 fatorlarida stack elementlarni ko‘rish imkonini beradi. Faqat element raqamini kiritishingiz kerak, hisoblash stack yuqorisidagi elementdan boshlanadi va keraklisini qaytaradi. Boshqa funksiyalari xizmatchi funksiyalar hisoblanadi, ular tashqi sinfdna foydalanish uchun mo‘ljallangan, yaʻni prinstack() funksiyasidan tashqari, bu funksiya stack elementlarini ekranga chiqaradi.
Endi stack shablon sinf uchun dastur tuzaylik va har doimgidek, stack sinf shablonni sinov bo‘ladi hamda asosiy funksiyalaridan foydalanishni ko‘ramiz.
4.4-dastur. Shablon sinfdan foydalanish.
// Created by MBBahodir include "stdafx.h"
#include using namespace std; #include "stack.h"
int main()
|
{
Stack stackSymbol(5); int ct = 0;
char ch;
while (ct++ < 5){ cin >> ch;
stackSymbol.push(ch); // element qoʻshish
}
cout << endl;
stackSymbol.printStack(); // ekranga chiqarish
cout << "\n\n Element oʻchirish\n"; stackSymbol.pop();
stackSymbol.printStack(); // ekranga chiqarish Stack newStack(stackSymbol);
cout << "\n\nNusxalash konstruktori!\n"; newStack.printStack();
cout << "2 tartibdagi element: "<< newStack.Peek(2) << endl; system("pause");
return 0;
}
|
|
| |