Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zvit_Stek_4_Smoliy.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
624.13 Кб
Скачать

Додатки Частина 1. Побудова атд

// stack.h

class stack

{

private:

int used, // змінна, що вказує на вершину стека

data[12], // масив елементів стека

item; // змінна, значення якої додається в стек

public:

stack (); // конструктор класу

bool EMPTY; // повертає значення 'true', якщо стек порожній і 'false',

// якщо це не так

void push ( int ); // додає новий елемент до стеку

void pop (); // вилучає елемент із стеку

int top (); // повертає значення вершини стека

int size (); // повертає розмір стека

};

// stack.cpp

#include "stack.h"

#include <iostream>

using namespace std;

stack::stack ()

{

used = 0;

item = 0;

EMPTY = true;

}

void stack::push ( int item )

{

data [used] = item;

used++;

EMPTY = false;

}

void stack::pop ()

{

used--;

if ( used == 0 )

EMPTY = true;

}

int stack::top ()

{

return ( data [used-1] );

}

int stack::size ()

{

return(used);

}

// main.cpp

#include <conio.h>

#include <iostream>

#include "stack.h"

using namespace std;

void output ( stack intStack ) // функція, для виводу динаміки стека

{

stack tmp;

tmp = intStack;

if( intStack.EMPTY == true )

wcout << L"Стек порожнiй\n";

else

{

cout << "[ ";

while ( tmp.EMPTY == false )

{

for ( int i=0; i < tmp.size (); i++ )

{

cout << tmp.top () << " ";

tmp.pop ();

}

}

cout << "]" << endl;

}

}

void main()

{

setlocale (LC_ALL,"rus_rus.866");

stack a;

int data,

size;

wcout << L"- Кiлькiсть елементiв у вхiднiй послiдовностi: ";

cin >> size;

wcout << L"- Введiть послiдовнiсть чiлих чисел: \n";

for ( int i = 1; i <= size; i++ )

{

wcout << L"Введiть " << i << L" елемент: ";

cin >> data;

if( data % 2 == 0 ) // якщо занчення елемента послідовності парне

{

if( a.size () == 12 )

{

wcout << L"- \"Переповнення cтеку\" (stack overflow)\n";

break;

}

else

a.push ( data );

}

if ( data % 2 != 0 ) // якщо значення елемента послідовності НЕ парне

{

if ( a.EMPTY == true )

{

wcout << L"- \"Втрата значимостi cтеку\" (stack underflow)" << endl;

//break;

}

else

a.pop ();

}

wcout << L"- Динамiка стека: ";

output ( a );

}

_getch();

}

Частина 2. Застосування атд

// stack.h

class stack

{

private:

int used, data[20] ,item;

public:

stack();

bool EMPTY;

void push(char);

void pop();

int top();

int size();

};

// stack.cpp

#include "stack.h"

#include <iostream>

using namespace std;

stack::stack()

{

used = 0; item=0; EMPTY=true;

}

void stack::push(char item)

{

data[used]=item;

used++;

EMPTY=false;

}

void stack::pop()

{

used--;

if(used==0)EMPTY=true;

}

int stack::top()

{

return(data[used-1]);

}

int stack::size()

{

return(used);

}

// main.cpp

#include <conio.h>

#include <string>

#include <iostream>

#include "stack.h"

using namespace std;

void vuvid(stack intStack) //фунція виводу вмісту стеку

{

stack tmps;

tmps=intStack;

if(intStack.EMPTY==true)

wcout<<"Stek poro*nij\n";

else

{

cout<<"{ ";

while ( tmps.EMPTY == false )

{

for ( int i=0; i < tmps.size(); i++ )

{

cout<<tmps.top()<<" ";

tmps.pop();

}

}

cout<<"}"<<endl;

}

}

int PRIOR(char a) //функція визначення пріоритету операції

{

switch(a)

{

case '*':

case '/':

return 3;

case '-':

case '+':

return 2;

case '(':

return 4;

}

}

void Func (stack &operat0r, stack &operand) //функція обрахунку виразу

{

char c = operat0r.top(); // верхній елемент стеку операторів

float rez = operand.top(); // верхній елемент стеку операндів

operand.pop();

if (c == '*') // якщо операція множення

{

operat0r.pop();

rez *= operand.top(); // виконується множення над двома верхніми елементами стеку операндів

operand.pop();

operand.push(rez); // у стек операндів записується результат операції

}

else if (c == '+') //якщо додавання

{

operat0r.pop();

rez += operand.top(); //виконується додавання над двома верхніми елементами стеку операндів

operand.pop();

operand.push(rez); //із записом результату

}

else if (c == '-')//якщо віднімання

{

operat0r.pop();

rez = operand.top() - rez; //виконується віднімання

//над двома верхніми елементами стеку операндів

operand.pop();

operand.push(rez); //і записується результат

}

else if (c == '/') //якщо ділення

{

operat0r.pop();

rez = operand.top() / rez; //виконується ділення над двома верхніми елементами стеку операндів

operand.pop();

operand.push(rez); // і записується результат

}

}

int main()

{

stack operand; //оголошення стеку операндів

stack operat0r; //оголошення стеку операторів

int i = 0;

string d;

char c;

float rez = 0;

float tmp = 0;

cout<<"Enter infix form expression :\n";

getline(cin,d);

int f = d.size();

for (int i = 0; i < f ; i++)

{

if ( isdigit(d[i]) != 0 ){ // Якщо число, то виконується його обрахунок та додавання у стек операндів

int j = i + 1;

tmp = d[i] - 48;

if ( j < f )

{

while (isdigit(d[j]) != 0)

{

tmp = tmp * 10 + d[j] - 48;

j++;

if (j == f) break;

}

}

if ((i + 1) <= j) operand.push(tmp);

if ((i - 1) <= f) i = j-1;

else break;

}

else //Якщо операція

{

if (operat0r.size() != 0) //Якщо стек операторів не пустий

{

if (PRIOR(operat0r.top()) == 4) //Якщо верхній елемент стеку '('

{

operat0r.push(d[i]); //До нього додається операція

}

else if ( PRIOR(operat0r.top()) >= PRIOR(d[i]) ) //якщо пріоритет вершини стека операторів більший пріоритета елемента що розгядається

{

while ( ( operat0r.top() != '(' ) && (operand.size() > 0) && (operat0r.size() > 0) ) //поки вершина стеку операторів не '(' і обидва стеки не пусті

{

Func(operat0r,operand); //виконується обрахунок виразу

}

operat0r.push(d[i]); // в стек операторів додається елемент що розглядався

}

else if (d[i] == '(') // якщо розглядається '('

{

operat0r.push(d[i]); // в стек операторів додається (

}

else if (d[i] == ')') //якщо розглядається ')'

{

while (operat0r.top() != '(') //поки не буде знайдено у стеку операторів відкриваючої душки

Func(operat0r,operand); //виконується обрахунок виразу

operat0r.pop();

}

else

{

operat0r.push(d[i]); // у всіх інших випадках операція просто додається до стеку операторів

}

}

else operat0r.push(d[i]);//якщо стек операторів пустий, до нього додається операція

}

}

if( (operat0r.size() != 0) && (operand.size() != 0) ) // якщо обидва стеки не пусті

{

while (operat0r.size() != 0) //поки є елементи у стеку операторів

{

Func(operat0r,operand); //виконується обрахунок виразу

}

}

cout <<"Rezult : "<<operand.top(); //вивід результату

getch();

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]