Стек на С++

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Turd
Сообщения: 7
Зарегистрирован: 11 апр 2005, 10:19

Здравствуйте, тут проблемка возникла:
задали сделать стек, в который помещаются целые положительные числа, как только встечается отрицательное прекратить ввод и вывести содержимое стека в обратном порядке.
проблема что мы их не проходили, искал разные варианты, но нормально разобраться не смог :o ops:
Если кто знает как примерно организовать, помогите :)
заранее благодарен
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Перенесена из C/C++
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Turd
Сообщения: 7
Зарегистрирован: 11 апр 2005, 10:19

Да, т.к. тему перенесли, то уточню - задание мне дали только на с++ :)
kotofay
Сообщения: 4
Зарегистрирован: 18 янв 2006, 20:46
Контактная информация:

простейшая реализация на С:

Код: Выделить всё

...
const StackSize = 256;
static int Stack[StackSize], StackPos = 0;
...

int push(int v){
   if(StackPos >= StackSize)
      return 0;
   Stack[StackPos++] = v;
   return 1;
};

int pop(int *pv){
   if(StackPos == 0)
      return 0;
   if(pv == NULL)
     return -1;
   *pv = Stack[--StackPos];
   return 1;
};
...
грубая на С++

Код: Выделить всё

// BC++ 3.1
#include <iostream.h>
typedef 
   enum {
      false, 
      true
   } bool;
class Stack {
   int sz, cp, *psd;
public:
   Stack(int _sz):cp(0){
      if(_sz > 0){
         sz = _sz;
         psd = (int*)new unsigned[sz];
      }// if
};
~Stack(void){
   if(psd)
      delete[] psd;
};
bool push(int val){
   if(cp >= sz || psd == NULL)
      return false;
   psd[cp++] = val;
   return true;
};
bool pop(int *pval = NULL){
   if(cp <= 0 || psd == NULL)
      return false;
   --cp;
   if(pval) 
      *pval = psd[cp];
   return true;
};
void print(void){
   cout << "\nStack: ";
   if(psd)
      for(int i = 0;i < cp;i++)
         cout << psd[i] << ' ';
   else
      cout << "error";
   };
};// class Stack


void main(void){
   Stack s(256);
   int val;
   while(1){
      cin >> val;
      if(val >= 0)
         s.push(val);
      else
         break;
   }// while

   s.print();

   s.pop();
   s.pop();

   cout << "\nPop all: ";
   while(s.pop(&val))
      cout << val << " ";
};
Turd
Сообщения: 7
Зарегистрирован: 11 апр 2005, 10:19

Спасибо большое, щас буду проверять :)
Turd
Сообщения: 7
Зарегистрирован: 11 апр 2005, 10:19

2 дня не мог проверить (проблемы были :( )
сейчас только сел, начал смотреть "грубую" реализацию, не понимаю почти ничего )
вопрос- зачем нужны s.print(); s.pop(); s.pop(); ?
+ s.pop() как я понял убирает последний символ
Turd
Сообщения: 7
Зарегистрирован: 11 апр 2005, 10:19

или, если можешь, объясни про 1-ый вариант, он без использования классов?
kotofay
Сообщения: 4
Зарегистрирован: 18 янв 2006, 20:46
Контактная информация:

ну незнаю чо там такого непонятного, пример работает,
тебе расписать всё как и что ?

s.print() -- нужен для печати элементов стека без их извлечения.
s.pop() - правильно, извлекает последний. А что два раза, это так, для демонстрации. Просто обрати внимание что метод вызывается без аргумента.
Вообще, всё что ниже s.print() и до закрывающей скобки можно убрать.
Ответить