
- •Процес знаходження номеру варіанта індивідуального завдання
- •Завдання на курсову роботу
- •4. Обчислити вираз, представлений в інфіксній формі запису.
- •1.Теоретична частина Стек
- •2. Завдання 3. Побудова атд
- •2. 1. Постановка задачі
- •2. 2. Динаміка вмісту
- •4. Обчислити вираз, представлений в інфіксній формі запису.
- •3.2.2. Граф-схема алгоритму
- •3.3. Результати виконання програми
- •Висновки
- •Список літератури
- •Додатки Частина 1. Побудова атд
- •Частина 2. Застосування атд
Додатки Частина 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;
}