Stek (inglizcha stack stek; stek o'qiladi) bu lifo tamoyili bo'yicha tashkil etilgan elementlarning ro'yxati bo'lgan mavhum ma'lumotlar turi


Download 39.61 Kb.
bet4/4
Sana02.01.2022
Hajmi39.61 Kb.
#190899
1   2   3   4
Bog'liq
Стеки в с узб

Введите шесть любых целых чисел:

9 5 2 1 5 6

Верхний элемент стека: 6

Давайте удалим верхний элемент

А это новый верхний элемент: 5

Process returned 0 (0x0) execution time : 0.010 s

Press any key to continue.

Peek () funktsiyasi

Stek kutubxonasiga yangi peek () funktsiyasi qo'shildi, u yordamida stekning N elementiga murojaat qilishingiz mumkin (yuqoridan).

Shunday qilib, bu funktsiya bilan stack qatorga o'xshay boshlaydi.

Quyida biz uchinchi elementni ko'rsatish uchun peek () funktsiyasidan foydalanganmiz:


1

2

3



4

5

6



7

8

9



  setlocale(LC_ALL,"rus");

  stack steck;

 

  steck.push(5);   // Добавляем



  steck.push(1);   // элементы

  steck.push(9);   // в

  steck.push(10);  // стек

 

  cout << "Третий элемент стека: " << steck.peek(3); // выведет 1



Ushbu funktsiyadan faqat C ++ 11 va undan yuqori versiyalarida foydalanishimiz mumkin.

Peek () funktsiyasidan dasturchilarning kichik doirasi foydalanadi va men darhol aytishim kerakki, bu funktsiya yaratuvchilar undan kutganidek ommalashmagan.

Massiv yordamida qanday qilib stek yaratish

Ko'plab dasturchilar stack naqshidan foydalanmaydilar, aksincha massivlar orqali stacklarda ishlaydi. Endi biz sizga massiv yordamida stekni qanday amalga oshirishni ko'rsatamiz.

Quyida biz 20 ta elementdan iborat - steck nomli qator yaratdik, shuningdek, st ning yuqori elementiga ishora qiluvchi o'zgaruvchini yaratdik.

Element qo'shish uchun biz i ni birma-bir oshiramiz va elementni steck [i] katagiga yozamiz.

Elementni olib tashlash uchun biz faqatgina i ni kamaytiramiz.

Ehtimol, allaqachon taxmin qilganingizdek, stekning yuqori elementiga kirish uchun biz shunchaki qatorning i elementiga murojaat qilamiz.

I o'zgaruvchisi push () funktsiyasi va top () funktsiyasini almashtirdi.

Stekning bo'shligini bilish uchun biz shunchaki i == -1 holatini tekshiramiz:

• Agar rost bo'lsa, u holda stek bo'sh bo'ladi.

• Agar u noto'g'ri bo'lsa, unda stekda ba'zi elementlar mavjud.

Massiv yordamida to'plamni amalga oshirish quyida keltirilgan:


1

2

3



4

5

6



7

8

9



10

11

12



13

14

15



16

17

18



19

20

21



22

23

24



25

26

27



28

29


#include

 

using namespace std;

 

int main() {

  int steck[20];

  int i = -1;  // объявили стек

    

  for (int j = 0; j < 6; j++) { int a; cin >> a;

    int a;

      

    cin >> a;      

 

    i++;  // увеличиваем i на один



      

    steck[i] = a;  // добавляем в стек элемент

  }

  

  if (i == -1) cout << "Стек пуст";  // проверяем пуст ли стек (нет)

    

  cout << steck[i] << " это верхний элемент стека";

    

  cout << "Сейчас мы удалим верхний элемент";

    

  i--;  // уменьшаем i на один

 

  system("pause");



  return 0;

}


Foydalanish uchun stack yaratishning usuli

Bugun biz stekni amalga oshirishning ikkita usulini ko'rib chiqdik:

• C ++ shablonidan foydalanish.

• Massivdan foydalanish.

Agar siz dasturingizda stekdan foydalanayotgan bo'lsangiz va uni iloji boricha tezroq ishlashini istasangiz, unda stackni amalga oshirishning birinchi usulidan foydalaning.

Agar siz dasturning ishlashi haqida qayg'urmasangiz, unda siz massiv orqali stek yaratilishidan foydalanishingiz mumkin. Shaxsan biz har doim stekni amalga oshirishning birinchi usulidan foydalanamiz. Uni ishlatish va reklama qilish tez va oson.

Keyingi darsda biz yana bir juda muhim ma'lumotlar tuzilishini - navbatni o'rganamiz. Ushbu ma'lumotlar tuzilishi ko'plab messenjerlarda (masalan, telegramda) foydalaniladi.

mashqlar


O'qigan materialingizni o’zlashtirish uchun sizga quyidagilarni maslahat beramiz:

1. Stekni e'lon qiling.

2. Unga istalgan 3 ta elementni qo'shing.

3. Yuqori elementni chiqaring.

4. Yuqori elementni olib tashlang.

5. Yuqori elementni yana torting.

Stekni faylga yozish

bu erda stackning bir elementi bo'lgan STACK tuzilmasi mavjud, fayllardan stackga elementlarni qo'shishda hech qanday muammo bo'lmaydi, cout yordamida hamma narsani tekshirdim, lekin stack-dan olib tashlashni va stack-dan ma'lumotlar fayliga o'tkazishni amalga oshirishga harakat qilsam, u chiqdi bu aniq emas.


va shunga qaramay, kiruvchi oqimni qatorlar qatoriga yozganimda, faylning birinchi elementi yozilmagan


1

2

3



4

5

6



7

8

9



10

11

12



13

14

15



16

17

18



19

20

21



22

23

24



25

26

27



28

29

30



31

32

33



34

35

36



37

38

39



40

41

42



43

44

45



46

47

48



49

50

51



52

53

54



55

56

57



58

59

60



61

62

63



64

65

66



67

68

69



70

71

72



73

74

75



76

77

78



79

80

81



82

83

84



85

86

87



88

89

90



91

92

93



94

95

96



97

98

99



100

101


102

103


104

105


106

107


108

109


110

111


112

113


114

115


116

117


118

119


120

121


122

123


124

125


126

127


128

129


130

131


132

133


134

135


136

137


138

139


140

#include

#include

#include

#include

using namespace std;

 

struct STACK {



 

     char info;

     STACK *next;

 

 };



 

// Проверка на пустоту

 int Empty(STACK *pstack)

 {

 



     if (pstack==NULL)

     return 0;

     else

     return 1;

 

 }

 



//Добавление эл-та

 void Add(STACK **pstack, char c)

 {

     cout<

     STACK *tmp=new STACK;

     (*tmp).info=c;

     cout<<(*tmp).info<

     tmp->next=*pstack;

     *pstack=tmp;

     cout<<(**pstack).info<

     delete tmp;

 }

 



//Удаление элемента из стека и вываод в масив

 void Pop(STACK **pstack, ofstream& to)

 {        

     STACK *tmp=*pstack;

     

     cout<<(**pstack).info<

     to<<(**pstack).info;

     *pstack=(*pstack)->next;

     delete tmp;

 

 }



 

 

 int main()



 {

     // Создадим потоки ввода и вывода из файла и в файл

    string iname,oname;

    cout<<"Type a name of an input file"<

    cin>>iname;

    ifstream from(iname.c_str());

    if (!from)

    {


       cerr<<"Can't open input file"<       system("pause");

       return 0;

    }


    cout<<"Type a name of an output file"<    cin>>oname;

    ofstream to(oname.c_str());

    if (!to)

    {

       cerr<<"Can't open output file"<

       system("pause");

       return 0;

    }

   


     char c;

     string str;

     while(from.get(c))

     from>>str;

     cout<

   


     setlocale(LC_ALL,"Russian");

     STACK *stack=NULL;

     int num;

     char otv;

     do

     {


 

         cout << "1. Добавление элементов в вершину стека" << endl

         << "2. Удаление элемента с вершины стека" << endl

         << "0. Выход" << endl;

         cout << " = ";

         cin >> otv;

         switch(otv)

         {

 

         case '1':



 

                 cout << endl << "Сколько элементов нужно добавить = " << endl;

                 cin >> num;

                 for (int i=0;i

                 {

                     Add(&stack, str[0]);

                     str.erase(0,1);                

                 }

                 cout << endl << "Элементы добавлены" << endl;

                 cout<

                 break;

 

             



 

         case '2':

 

         



          /*STACK *tmp=stack;

          cout<

          *stack=(*stack)->next;

          delete tmp;*/

          if (Empty(stack)==0)

          cout << endl << "Стек пуст" << endl;

          else

                 {

               

                 Pop(&stack, to);

                 cout << endl << "Элемент переведен в файл" << endl;

                 }

          break;

 

         case '0':



             break;

 

         default:



 

             cout << endl << "Ошибка" << endl;

             break;

 

         }



 

     }while(otv!='0');

     cin.get();

 

 }



Stek to'plami

Stack klassi LIFO (Last In First Out) algoritmidan foydalanadigan to'plamni ifodalaydi. Ushbu tashkilot bilan har bir keyingi qo'shilgan element avvalgisining ustiga joylashtiriladi. To'plam teskari tartibda olinadi - to'plamdagi eng yuqori element olinadi.

Stack sinfida elementlarni boshqarishga imkon beradigan ikkita asosiy usul mavjud:

• Push: avval stekka element qo'shadi

• Pop: birinchi elementni to'plamdan chiqaradi va chiqaradi

• Peek: shunchaki birinchi elementni olib tashlamasdan stekdan qaytaradi

Keling, bir misolni ko'rib chiqaylik:
using System;

using System.Collections.Generic;

 

namespace Collections



{

    class Program

    {

        static void Main(string[] args)



        {

 

            Stack numbers = new Stack();



 

            numbers.Push(3); // в стеке 3

            numbers.Push(5); // в стеке 5, 3

            numbers.Push(8); // в стеке 8, 5, 3

 

            // так как вверху стека будет находиться число 8, то оно и извлекается



            int stackElement = numbers.Pop(); // в стеке 5, 3

            Console.WriteLine(stackElement);

 

            Stack


persons = new Stack
();

            persons.Push(new Person() { Name = "Tom" });

            persons.Push(new Person() { Name = "Bill" });

            persons.Push(new Person() { Name = "John" });

 

            foreach (Person p in persons)



            {

                Console.WriteLine(p.Name);

            }

 

            // Первый элемент в стеке



            Person person = persons.Pop(); // теперь в стеке Bill, Tom

            Console.WriteLine(person.Name);

 

            Console.ReadLine();



        }

    }


 

    class Person



    {

        public string Name { get; set; }



    }

}

Download 39.61 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling