Преобразовать инфикс в префиксную нотацию

У меня есть задача: создать программу (C ++), которая преобразует нотацию «инфикс» в «префикс» и использует собственные реализации «стек и очередь».

Но я получаю: "Critical error detected c0000374" а также "Free Heap block modified at ... after it was freed" наконец строка void main() { /*...*/ system("pause"); } или, наконец, строка void toPrefix();

Может кто-нибудь помочь мне и указать мою ошибку (ошибки), пожалуйста?

Source.cpp:

#include "iostream"#include "fstream"#include "string"#include "Stack.h"#include "Queue.h"
void toPrefix(const std::string& first)
{
int length = first.length();
char test = NULL, operand = NULL;
char *ptr = &test, *op_ptr = &operand;
Queue<char> List;
std::string Output;
Stack<char> OpStack;
for (int i = length - 1; i >= 0; i--) List.push(first[i]); //
while (List.getsize() != 0)
{
List.pop(ptr);
if (test >= 48 && test <= 57) //is it number?
{
Output.insert(Output.begin(), test);
}
if (test == '*' || test == '/' || test == '-' || test == '+')
{
OpStack.push(test);
}
if (test == ')')
{
OpStack.push(test);
}
if (test == '(')
{
OpStack.pop(op_ptr);
while (operand != ')')
{
Output.insert(Output.begin(), operand);
OpStack.pop(op_ptr);
}
}
}
}

void main()
{
const std::string& first = "9-(2+2)";
toPrefix(first);
system("pause");
}

Queue.h:

#include<iostream>

template <typename T>
class Queue
{
private:
struct queue_element
{
T value;
queue_element *next;
};

queue_element *first;
queue_element *last;
int size;

public:
Queue()
{
first = new(queue_element);
last = first;
first->value = -1;
first->next = 0;
size = 0;
}
Queue(T x)
{
first = new(queue_element);
last = first;
first->value = x;
first->next = 0;
size = 1;
}

int getsize()
{
return size;
}

void push(T value)
{
if (size == 0)
{
size++;
last = first;
first->value = value;
first->next = 0;
}
else
{
size++;
queue_element *temp = new(queue_element);
temp->next = 0;
temp->value = value;
last->next = temp;
last = temp;
}
}

void pop(T* ret)
{
if (size == 0)
{
std::cout << "Queue is empty!" << std::endl;
return;
}
queue_element *temp = first;
*ret = first->value;
first = first->next;
size--;
}

void peek(T *ret)
{
if (size == 0)
{
std::cout << "Queue is empty!" << std::endl;
return;
}
*ret = first->value;
}
};

Stack.h

#include <iostream>

template <typename T>
class Stack
{
private:
struct stack_element
{
T value;
stack_element *next;
};
stack_element *first;
stack_element *last;
int size;

public:
Stack()
{
last = new(stack_element);
first = last;
last->value = -1;
last->next = first;
size = 0;
}
Stack(T x)
{
last = new(stack_element);
first = last;
last->value = x;
last->next = 0;
size = 1;
}

int getsize()
{
return size;
}

void push(T value)
{
if (size == 0)
{
size++;
last->value = value;
last->next = first;
}
else
{
size++;
stack_element *temp = new(stack_element);
temp->next = last;
temp->value = value;
last = temp;
}
}

void pop(T* ret)
{
if (size == 0)
{
std::cout << "Stack is empty!" << std::endl;
return;
}
stack_element *temp = last;
*ret = last->value;
last = last->next;
delete temp;
size--;
}

void peek(T *ret)
{
if (size == 0)
{
std::cout << "Stack is empty!" << std::endl;
return;
}
*ret = first->value;
}
};

0

Решение

Ну … я думаю, что проблема в тебе Stack учебный класс.

Строка, которую вы передаете toPrefix() является "9-(2+2)"

Так что операция у вас Stack<char> OpStack, определенный в toPrefix()(если я хорошо понимаю)

  1. конструкция с конструктором по умолчанию (без аргументов)

  2. push() в переписке -

  3. pop() в переписке (

  4. push() в переписке +

  5. push() в переписке )

Что ж, посмотрим, что в нем происходит

1) после построения с конструктором по умолчанию

у нас есть

1a) size == 0

1b) first, last, first->next а также last->next которые указывают на одну и ту же выделенную область памяти

1c) first->value == last->value == (char)-1

2) после первого звонка push()-)

у нас есть

2а) size == 1

2b) first, last, first->next а также last->next которые указывают на одну и ту же выделенную область памяти

2в) first->value == last->value == '-'

3) после первого звонка pop()

у нас есть

3a) size == 0

3b) first, last, first->next а также last->next которые указывают на одну и ту же удаленную область памяти

3в) first->value == last->value == '-'

4) звоню во второй раз push()+)

4а) size увеличивается

4b) написано (last->value = value;) в УДАЛЕННОЙ области

4c) снова написано (last->next = first;) в УДАЛЕННОЙ области

Я полагаю, что это может объяснить вашу проблему.

с .: предложение «использовать отладчик» от Рэмбо Рамона и Сэма Варшавчика является хорошим предложением (ИМХО)

p.s.2: извините за мой плохой английский

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]