2012-04-12 6 views
0

Я немного зациклен на том, как использовать стек, и почему я даже использовал бы стек в коде, который пишу. В assingment говорится написать программу, которая проверяет правильность ввода пользователя или нет. Это простая программа, в которой есть три разных варианта выбора, которые могут использоваться. 1. базовые скобки() 2. стандартные скобки() [] {} и 3. скобки с пользовательским контролем. Единственное, что должна сделать главная программа, это проверить, правильно ли сформирован пользовательский ввод или нет, и отображать только это сообщение на экране.C++ HW Help using stack

У меня есть файл StackLS.cpp и Stack.h, который я использую вместе с моим main.cpp. Я вставлю пример кода из каждого из них.

StackLS.h

typedef int elemType; // flexible data type 

class StackLS 
{ 
private: 
// inner class node 

class Node 
{ 
public: 
    elemType data; // data portion 
    Node *next; // link to the seccessor 
}; // end Node 

// data members 
Node *topItem; // pointer to the top element of this stack 

// utilities 

     public: 
// constructors 
StackLS(void); // default constructor 
StackLS(const StackLS& aStack); // copy constructor 

// observers 
bool isEmpty(void) const; 
// returns true if this stack is empty 
//   false otherwise 

bool isFull(void) const; 
// returns true if this stack is full 
//   false otherwise 

elemType top(void) const; 
// precondition: this stack is not empty 
// returns top element in this stack 

// transformers 
void push(const elemType& item); 
// precondition: this stack is not full 
// adds item to this stack 

void pop(void); 
// removes top element from this stack if exist 
// remains empty otherwise 

void makeEmpty(void); 
// makes this stack empty 

// destructor 
~StackLS(void); 
}; // end StackLS 

StackLS.cpp

 // constructors 
     StackLS::StackLS(void) 
    // default constructor 
    { 
topItem = 0; 
     } // end default constructor 

     StackLS::StackLS(const StackLS& aStack) 
    // copy constructor 
     { 
     } // end copy constructor 

     // observers 
     bool StackLS::isEmpty(void) const 
     // returns true if this stack is empty 
     //   false otherwise 
     { 
    return topItem == 0; 
     } // end isEmpty 

     bool StackLS::isFull(void) const 
     // returns true if this stack is full 
     //   false otherwise 
     { 
return false; 
     } // end isFull 

     elemType StackLS::top(void) const 
     // precondition: this stack is not empty 
     // returns top element in this stack 
     { 
// return (*topItem).data; 
return topItem->data; 
     } // end top 

     // transformers 
     void StackLS::push(const elemType& item) 
     // precondition: this stack is not full 
      // adds item to this stack 
      { 
Node *newNode = new Node; 
newNode->data = item; 
newNode->next = topItem; 
topItem = newNode; 
     } // end push 

     void StackLS::pop(void) 
     // removes top element from this stack if exist 
     // remains empty otherwise 
     { 
if (topItem != 0) 
{ 
    Node *temp = topItem; 
    topItem = topItem->next; 
    delete temp; 
} 
     } // end pop 

     void StackLS::makeEmpty(void) 
     // makes this stack empty 
     { 
    while (topItem != 0) 
{ 
    Node *temp = topItem; 
    topItem = topItem->next; 
    delete temp; 
    } 
     } // end makeEmpty 

     // destructor 
      StackLS::~StackLS(void) 
     { 
//while (!isEmpty()) 
// pop(); 
while (topItem != 0) 
{ 
    Node *temp = topItem; 
    topItem = topItem->next; 
    delete temp; 
} 
     } // end destructor 

Вот main.cpp, что у меня до сих пор. main.cpp

 #include <iostream> 
     #include <string> 
     #include "StackLS.h" 
     using namespace std; 

     do { 

     int main() 
     { 
char answer; 
char n; 
StackLS stack; 

cout << " ********** MENU ********** " << endl; 
cout << " 1. Basic Brackets() " << endl; 
cout << " 2. Standard Brackets()[]{} " << endl; 
cout << " 3. User-Defined brackets " << endl; 
cout << " Please enter your choice: " << endl; 

switch (choice){ 
case 1: 
    cout << "Current Setting:() " << endl; 
    cout << "Enter your expression followed by a ; : " << endl; 
    do { 

    cin >> answer; 
     while (answer != ;) 
    } 


      } // end main 

     } 
while (choice != 'n' || 'N') 

Опять мне интересно, как я хотел бы использовать стек я показал вам в этой программе (main.cpp). Я немного смущен тем, почему я бы использовал стек и почему. Любая помощь приветствуется. Благодарю. Main.cpp может быть неправильным, но снова я учусь, и именно поэтому я здесь, чтобы узнать больше. Спасибо

+0

Когда кто-то говорит «стек», они обычно означают «стек вызовов». У вас есть структура данных * стека *, но это не * * стек. –

ответ

1

Когда вы видите открытую скобу, вы вставляете ее в стек. Когда вы видите закрывающую фигуру, вы убедитесь, что она является копией скобки поверх стека, а затем выталкивает ее. Когда ваш ввод завершен, убедитесь, что стек пуст.

+0

Хорошо. Это немного помогает. Я не уверен, как это сделать. Как бы я ввел код, если он открывает скобу, а затем нажмите и закрывайте, чтобы убедиться, что она является параллельной открывающей скобе. Есть ли советы по этому поводу? – Lea

+1

Просто пропустите через один символ за один раз и сравните его с различными типами фигурных скобок. –

+0

У меня есть цикл, чтобы делать по одному персонажу за раз. Я потерял, как я использую стек в main.cpp. Как я использую методы, объявленные в каждом. – Lea