2014-01-20 2 views
0

мой вопрос: как реализовать функцию Stack :: top() без использования библиотеки std :: stack? Другими словами, как я могу написать свою собственную функцию top(), которая возвращает верхний элемент стека, не выбирая его для следующего стека?Как реализовать функцию stack :: top()?

Спасибо.

#include <iostream> 
#include <stdexcept> 

using namespace std; 

class Stack 
{ 
private: 
    int *p; 
    int top,length; 

public: 
    Stack(int = 0); 
    ~Stack(); 

    void push(int); 
    int pop(); 
    void display(); 
}; 

Stack::Stack(int size) 
{ 
    top=-1; 
    length=size; 
    while(length <= 0)    //If the stack size is zero, allow user to mention it at runtime 
    { 
     cout<<"Stack of zero size"<<endl; 
     cout<<"Enter a size for stack : "; 
     cin >> length; 
    } 
    p=new int[length]; 
} 

Stack::~Stack() 
{ 
    delete [] p; 
} 

void Stack::push(int elem) 
{ 
    if(top==(length-1))  //If the top reaches to the maximum stack size 
    { 
     throw overflow_error("Can't push onto a full stack"); 
    } 
    else 
    { 
     top++; 
     p[top]=elem; 
    } 
} 
int Stack::pop() 
{ 
    if(top==-1) 
    { 
     throw underflow_error("Can't pop from an empty stack"); 
    } 
    int ret=p[top]; 
    top--; 
    length--; 

    return ret; 
} 

void Stack::display() 
{ 
    for(int i = 0; i <= top; i++) 
     cout<<p[i]<<" "; 
    cout<<endl; 
} 

int main() 
{ 
    int len; 

    cout<<"Enter a size for stack : "; 
    cin >> len; 
    Stack s1(len); 
    try{ 
     s1.push(1); 
     s1.display(); 
     s1.push(2); 
     s1.push(3); 
     s1.push(4); 
     s1.push(5); 
     s1.display(); 
     s1.pop(); 
     s1.display(); 
     s1.pop(); 
     s1.display(); 
     s1.pop(); 
     s1.display(); 
     s1.pop(); 
     s1.display(); 
     s1.pop(); 
     s1.display(); 
    } 
    catch(overflow_error){ 
     cerr<< "Illegal operation. Cannot push onto a full stack."; 
     return -1; 
    } 
    catch(underflow_error){ 
     cerr<< "Illegal operation. Cannot pop from an empty stack."; 
     return -1; 
    } 
} 
+0

На самом деле, я думаю, что в вашем коде есть ошибка. Почему вы уменьшаете 'length' в' pop() '? Таким образом вы уменьшаете максимальный размер вашего стека каждый раз, когда вы вызываете 'pop()', что, вероятно, не является преднамеренным. – Mario

+0

Хороший улов, спасибо, я его удалю. – user3205160

ответ

2

Поскольку вы уже хранить top, вы можете просто вернуть p[top]. Или другими словами: top() будет по существу таким же, как pop(), он просто не удалит верхний элемент.

+0

С дополнительным тестом на недоиспользование. – woolstar

+0

Я не могу заставить его работать. Является ли код таким? 'INT Stack :: stackTop() { \t // проверить, если стек пуст первым \t если (сверху == -1) { \t бросок underflow_error ("Не может выскочить из пустого стека"); } \t еще \t { \t \t соиЬ << "Первый элемент является:" + р [вверх] << End L,; \t} } ' – user3205160

+0

Просто скопируйте свой' pop() '1: 1 и удалите строку' top -; '. – Mario

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