Стеки, очереди и деки
Автор: Аарон Иванов • Февраль 26, 2018 • Лабораторная работа • 4,129 Слов (17 Страниц) • 426 Просмотры
Министерство науки и образования Республики Казахстан
Карагандинский государственный технический университет.
Лабораторная работа №2
Дисциплина: Алгоритмы и структуры данных
Тема: Стеки, очереди и деки
.
Выполнил:
Студент гр. ИНФ-17-2
Алиев С.С.
Караганда 2018
Цель данной работы: Написать программу – калькулятор, вычисляющую значение арифметического выражения. Выражение может содержать операнды, скобки и знаки операций. Операнды – целые числа. В выражении могут быть использованы бинарные операции: сложение, вычитание, умножение, деление и возведение в степень, – и унарные: унарный минус и квадратный корень.
Указания. Унарный минус встречается только в начале выражения или после открывающей скобки. Унарный минус при преобразовании в польскую запись лучше заменить другим символическим обозначением (например, ‘$’). Также не стоит забывать, что возведение в степень и извлечение корня обладают большим приоритетом, чем приоритет арифметических операций.
Листинг программы:
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace std;
template
class Stack_calc
{
private:
T *data_;
int last_;
int dataSize_;
public:
Stack_calc(int size = 0)
{
data_ = nullptr;
if (size <= 0) this->dataSize_ = 50;
last_ = -1;
data_ = new T(this->dataSize_);
}
//~Stack_calc()
//{
// delete [] data_;
// data_ = nullptr;
//}
void push(T ch)
{
if (last_ == dataSize_)
{
dataSize_ = (dataSize_ * 3) / 2;
data_ = (T*)realloc(data_, dataSize_ * sizeof(T));
}
data_[++last_] = ch;
}
T pop()
{
T ch;
if (last_ >= 0)
{
ch = data_[last_];
last_--;
return ch;
}
else
{
cout << "Stack is empty!" << endl;
return 0;
}
}
T show_top(){
return data_[last_];
}
bool check()
{
if(last_< 0)
{
return 0;
}
return true;
}
};
class RPN
{
Stack_calc
Stack_calc
string output;
string temp;
public:
double calculate(string s)
{
string output = getexp(s);
double result = counting(output);
return result;
}
double counting(string exp)
{
double result;
for(size_t i = 0; i < exp.size(); i++)
{
if(is_num(exp[i]))
{
while(!is_delimiter(exp[i]))
{
temp += exp[i++];
if (i == exp.size()) break;
}
...