Просто добавьте что-то примечательное здесь.
myQueue.hpp:
template <class T>
class QueueA {
int size;
...
public:
template <class T> T dequeue() {
// implementation here
}
bool isEmpty();
...
}
myQueue можно определить методы шаблонного класса, которые просто прекрасны в файле реализации. cpp:
// implementation of regular methods goes like this:
template <class T> bool QueueA<T>::isEmpty() {
return this->size == 0;
}
main()
{
QueueA<char> Q;
...
}
В вашем коде есть некоторые проблемы:
вы должны использовать ungetc()
вместо fseek()
для возврата на один символ, чтобы избежать сбоя в потоках, которые не поддерживают поиск.
вы должны написать (check == '(')
вместо жесткого кодирования значения символа ASCII. Это и более портативный и более читаемый.
Чтобы избежать неопределенного поведения, вы должны проверить EOF
и fscanf()
успешный анализ. На самом деле, это позволило бы избежать необходимости теста на check
.
Когда вы анализируете листовой узел, вы не должны рекурсировать и анализировать дополнительные узлы ниже текущего.
index
кажется избыточным, так как последовательности узлов должно быть достаточно, чтобы полностью определить, где остановиться.
Вот модифицированная версия:
Node *constructTreeHelper(FILE *infile, int *index) {
double lwire, rwire;
int sink;
double cap;
Node *node;
// Base case
if (*index <= 0) {
// This test seems redundant with the file contents */
return NULL;
}
// this fscanf will fail on the byte byte if it is not a '('
if (fscanf(infile, " (%le %le)", &lwire, &rwire) == 2) {
// If the node is not a leaf node
node = createNode(0, 0, lwire, rwire);
*index -= 1;
node->right = constructTreeHelper(infile, index);
node->left = constructTreeHelper(infile, index);
} else if (fscanf(infile, "%d(%le)\n", &sink, &cap) == 2) {
// If the node is a leaf node
node = createNode(sink, cap, 0, 0);
*index -= 1;
} else {
// invalid format or end of file */
node = NULL;
}
return node;
}