2010-07-17 5 views
1

Как я могу закодировать стек на C++? Я попытался это себя следующим образом:реализовать стек в C++

#include <iostream> 
using namespace std; 
#define max 10 
class stack{ 

private: 
    int arr[max]; 
    int top; 
public: 
    stack(){ 

     top=-1;//empty initialy stack 

    } 

    void push(int i){ 
     top++; 
     if (top<max){ 

      arr[top]=i; 
     } 
     else{ 
      cout<<"stack full"<<endl; 
      top--; 
    } 

    } 
int pop(){ 

    if (top==-1){ 
     cout<<"stack is emphty"); 
    return NULL; 
    } 
    else{ 
     int data=arr[top]; 
     arr[top]=NULL; 
     top--; 

    return data; 
} 
} 
bool empty(){ 

    return (top==-1); 

} 
}; 
int main(){ 

    stack a; 
    a.push(12); 
    a.push(30); 
    a.push(23); 
    a.push(42); 
    a.push(100); 
    while (!a.empty()){ 
     a.pop(); 



    } 



    return 0; 
} 

Но я получаю следующие ошибки:

1>------ Build started: Project: stack_implementations, Configuration: Debug Win32 ------ 
1> stak_implementation.cpp 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(31): error C2059: syntax error : ')' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(34): error C2059: syntax error : 'else' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(34): error C2334: unexpected token(s) preceding '{'; skipping apparent function body 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(42): error C2628: 'stack' followed by 'bool' is illegal (did you forget a ';'?) 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(44): error C2065: 'top' : undeclared identifier 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(31): error C2143: syntax error : missing ';' before '}' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(47): error C2059: syntax error : '}' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(47): error C2143: syntax error : missing ';' before '}' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(47): error C2059: syntax error : '}' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(56): error C2039: 'empty' : is not a member of 'stack' 
1>   c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(4) : see declaration of 'stack' 
1>c:\users\david\documents\visual studio 2010\projects\stack_implementations\stak_implementation.cpp(56): fatal error C1903: unable to recover from previous error(s); stopping compilation 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Это для школьного задания? Хорошая идея может заключаться в том, чтобы сделать углубление кода лучше для удобства чтения. –

+0

не забывайте комментирование, и вы также можете использовать C++ const, возможно, позже вы можете добавить дополнительную программу в качестве шаблона и выбросить исключения, если стек заполнен. – Quonux

ответ

1

Код будет менее подвержен ошибкам и более четким, если вы только измените состояние (переменные, члены и т. Д.), Когда вам нужно. Итак, если вы перепишете функцию push в

void push(int i){ 
    if (top<max-1){ 
     arr[++top]=i; 
    } 
    else{ 
     cout<<"stack full"<<endl; 
    } 
} 

будет чище. Кроме того, const является безопасным по типу, тогда как #define - нет, поэтому const int max=10 предпочтительнее #define max 10.

Поскольку стек представляет собой стек целых чисел, NULL в вашем назначении arr[top]=NULL будет отлит в int, а присваивание будет интерпретировано как arr[top]=0. Вы можете полностью удалить назначение, поскольку элемент находится за пределами стека, когда он выскочил, и, следовательно, не имеет значения, является ли оно нулевым или нет.

BTW, я бы использовал top как указатель на следующий доступный элемент стека, а не указатель на последний использованный, чтобы избежать наличия зарезервированного значения «не указателя» -1.

5

Вы получили бездомную закрывающую скобку по линии 31;

cout<<"stack is emphty"); 

Исправить это и посмотреть, как многие другие «ошибки» исчезнут.

Не беспокойтесь о том, чтобы сразу не обнаружить его. Это случалось со мной много раз. Вы убеждены, что с вашим кодом что-то серьезное, так что вы не заметили тривиальных опечаток и орфографических ошибок.

+0

да, я исправил его, спасибо всем –

1

У вас есть несбалансированная скобка в строке 31, как сообщается вашим компилятором.

cout<<"stack is emphty"); 

Пожалуйста, внимательно прочитайте эти ошибки компилятора. Обычно они сразу указывают на проблему.

Смежные вопросы