Страница 1 из 1
Стек на С++
Добавлено: 24 янв 2006, 14:40
Turd
Здравствуйте, тут проблемка возникла:
задали сделать стек, в который помещаются целые положительные числа, как только встечается отрицательное прекратить ввод и вывести содержимое стека в обратном порядке.
проблема что мы их не проходили, искал разные варианты, но нормально разобраться не смог

ops:
Если кто знает как примерно организовать, помогите
заранее благодарен
Добавлено: 24 янв 2006, 15:14
DeeJayC
Перенесена из C/C++
Добавлено: 24 янв 2006, 15:20
Turd
Да, т.к. тему перенесли, то уточню - задание мне дали только на с++

Добавлено: 24 янв 2006, 17:10
kotofay
простейшая реализация на С:
Код: Выделить всё
...
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 << " ";
};
Добавлено: 24 янв 2006, 17:26
Turd
Спасибо большое, щас буду проверять

Добавлено: 26 янв 2006, 16:39
Turd
2 дня не мог проверить (проблемы были

)
сейчас только сел, начал смотреть "грубую" реализацию, не понимаю почти ничего )
вопрос- зачем нужны s.print(); s.pop(); s.pop(); ?
+ s.pop() как я понял убирает последний символ
Добавлено: 26 янв 2006, 16:40
Turd
или, если можешь, объясни про 1-ый вариант, он без использования классов?
Добавлено: 30 янв 2006, 11:17
kotofay
ну незнаю чо там такого непонятного, пример работает,
тебе расписать всё как и что ?
s.print() -- нужен для печати элементов стека без их извлечения.
s.pop() - правильно, извлекает последний. А что два раза, это так, для демонстрации. Просто обрати внимание что метод вызывается без аргумента.
Вообще, всё что ниже s.print() и до закрывающей скобки можно убрать.