View Full Version : [PLEASE HELP ASAP] Stacks
DaNYer
Mar 30, 2003, 20:09
Pojaluista pomogite naiti problemmu, u menya uje ruki opuskaiutsya.....
esli est' dva stacka, mi delaem sleduiushee:
push(s1, 2);
push(s1, 3);
push(s2, 4);
push(s2, 5);
to po idee esli sdelat' posle etogo vot tak:
test1=pop(s1); //doljno bit' 3
test2=pop(s2); //doljno bit' 5
printf("TEST1 = %d\n", test1);
printf("TEST2 = %d\n", test2);
to na ekran doljno viprintat'sya sleduyuhsee:
TEST1 = 3
TEST2 = 5
a vmesto etogo u menya poluchaetsya
TEST1 = 5
TEST2 = 4
kak mne etu dolbannomu algoritmu obyasnit' chto u menya DVA stacka a ne ODIN?????????
privoju svoi kod:
//header file
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 100
#define BOTTOM -1
#define TRUE 1
#define FALSE 0
struct stack
{
int top;
int elements[STACKSIZE];
};
typedef struct stack STACK;
a vot i main
#include "stacks.h"
// basic operation function prototypes
void init(STACK *);
int empty(STACK *);
int pop(STACK *);
void push(STACK *, int);
void main ()
{
int test1, test2;
STACK *s1;
STACK *s2;
init(s1);
init(s2);
push(s1, 2);
push(s1, 3);
push(s2, 4);
push(s2, 5);
test1=pop(s1); //doljno bit' 3
test2=pop(s2); //doljno bit' 5
printf("TEST1 = %d\n", test1);
printf("TEST2 = %d\n", test2);
}
//** stack basic operation functions go here:
//** initstack
void init(STACK *s)
{
s->top = BOTTOM;
}
//empty **************
int empty(STACK *s)
{
if(s->top == BOTTOM)
return (TRUE);
else
return (FALSE);
}
//******* pop
int pop(STACK *s)
{
if(empty(s))
{
printf("%s","stack underflow");
exit(1);
}
return(s->elements[s->top--]);
}
//******* push
void push(STACK *s, int x)
{
if(s->top == STACKSIZE-1)
{
printf("%s","stack overflow");
exit(1);
}
else
{
s->elements[++(s->top)] = x;
return;
}
}
странно, что у тебя вообще что-то работает :)
STACK *s1;
STACK *s2;
означает, что у тебя есть лишь указатели (а не реальные данные) - на что они указывают, DaNYer ?
черт-те знает на что.
;)
STACK s1_data;
STACK s2_data;
STACK *s1 = &s1_data;
STACK *s2 = &s2_data;
вот тока после этого...
DaNYer
Mar 31, 2003, 05:53
Gar jan, privet
oni ukazivaiut na structure - stack
....
ya spat' poidu, pozdno ujo...
do zavtra :)
Originally posted by DaNYer
Gar jan, privet
oni ukazivaiut na structure - stack
....
ya spat' poidu, pozdno ujo...
do zavtra :)
привет-привет ;)
исходя из этого кода, я все-таки настаиваю на том, что указатели у тебя указывают на что угодно, но не на существующие структуры.
void main ()
{
int test1, test2;
STACK *s1;
STACK *s2;
init(s1);
init(s2);
...
я на твоем месте "new" бы делал :)
или завел бы переменные типа STACK, а не STACK*.
gar obrati vnimanie na header file i na typedef...... na nee i ukazivaet... xotya ya mojet i oshibaius''
esli ne trudno mojesh ti ili kto nibud' eshe napisat' mne RABOTAYUSHYUIU versiyu etoi demki s DVUMYA NEZAVISIMIMI STACKAMI????
spasibo zaranee.....
Вот тебе работающий код:
Originally posted by Greco
странно, что у тебя вообще что-то работает :)
STACK *s1;
STACK *s2;
означает, что у тебя есть лишь указатели (а не реальные данные) - на что они указывают, DaNYer ?
черт-те знает на что.
;)
STACK s1_data;
STACK s2_data;
STACK *s1 = &s1_data;
STACK *s2 = &s2_data;
вот тока после этого...
Agregat
Apr 1, 2003, 07:45
Гарик, ты тоже муру написал...
s1 = new STACK;
s2 = new STACK;
...
delete s1;
delete s2;
//все, как у людей.... если же уже
STACK s1;
STACK s2;
то создавать указатели излишне:
push(&s1, 3);
rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
Originally posted by DaNYer
rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
Извините за цинизм, не удержался... :devil:
На лицо... или на лице, конфликт цивилизаций: Евразия поясняет суть проблемы и дает множество (причем правильных) решений, а Америка все твердит - НЕТ, эта программа не работает. Остается одно, бомбить эту программу, что бы свергнуть ненавистный баг, который только она и видит! Хотя весь баг в том, что та же Америка подходит к решения своими методами (причем неверными в корне) и твердо стоит на своем :spin:
Ну что же, удачи тебе, Америка, в твоем крестовом (на который положили крест) походе :crackup: :crackup: :crackup:
Originally posted by DaNYer
rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
извини, тогда я просто умываю руки.
2 Nemra: тебе бы в Политикс..;)
vot i vsya problema...
spasibo rebyata
razbombil konechno i nashel
(razumeetsya ya ispol'zoval bombi i krilatie raketi VISOKOI TOCHNOSTI) :devil:
Vit', ukazateli vse taki nujni...
sorry chto usomnilsya :)
Nemra, tebe slovo ;)
Agregat
Apr 2, 2003, 14:15
По-моему не надо... пришли мне на майл верию с указателями я ее переделаю так, что будет пахать без них! :)
Originally posted by DaNYer
vot i vsya problema...
spasibo rebyata
razbombil konechno i nashel
(razumeetsya ya ispol'zoval bombi i krilatie raketi VISOKOI TOCHNOSTI) :devil:
Vit', ukazateli vse taki nujni...
sorry chto usomnilsya :)
Nemra, tebe slovo ;)
Какое слово? предыдущий reply был "&". Если это означает, что ты взял обьекты типа STACK, а не указатели, то все работает и проблем нету. Что же мне еще сказать??? не часто я сюда захожу поэтому попробую хоть что-то ответить ;)... до следующего раза.
Действительно, typedef struct stack STACK; не обьявляет переменные, а просто дает другое имя типу. И кстати, насколько я понимаю из стиля, программа писалась на С, так что использовать new и delete нельзя, народ (т.е. компилятор) нe поймет :) Можно использовать malloc и free. Если же можно на C++, то практичнее написать класс, а рекоммендуется все-таки пользоваться стандартом... например:
#include <stack>
#include <iostream>
typedef std::stack<int> STACK;
int main()
{
STACK s1, s2;
s1.push(2);
s1.push(3);
s2.push(4);
s2.push(5);
std::cout << "TEST1 = " << s1.top() << std::endl;
std::cout << "TEST2 = " << s2.top() << std::endl;
return 0;
}
Agregat
Apr 2, 2003, 15:18
std::stack и std::queue ведь не являются на самом деле классами, они просто обертки вокруг std::deque, или чего-нить еще если вставить второй template параметер.
Так что можно еще проще
#include <deque>
#include <iostream>
typedef std::deque<int> STACK;
int main()
{
STACK s1;
STACK s2;
s1.push_back(1);
s2.push_back(2);
std::cout << s1.back() << std::endl;
std::cout << s2.beck << std::endl;
return 0;
}
Вот :) :) :)
Nemra ;)
Agregat, krasivoe reshenie :) mne ponravilos', no k sojaleniu proga (v principe eto skelet odnoi iz funkcii dlya odnogo projecta....) DOLJNA bit' na C a ne C++ i ya uje razreshil etu problemmu... s vashei pomoshyu razumeetsya :)
spasibo
Agregat
Apr 2, 2003, 15:51
:) :)
2 два решения привел, не знаю какое...
второе почти такое же, как и у уважаемого товарища Немра. :) :)
Originally posted by Agregat
:) :)
2 два решения привел, не знаю какое...
второе почти такое же, как и у уважаемого товарища Немра. :) :)
Странно, с чего это так меня стали уважать :)
А по поводу std::stack & std::queue: так они не просто обертки, а логические обертки. Было бы странно ожидать от стека функций типа push_back, если push у него всегда в одну сторону. Причина также в определении полного и непротеворечивого интерфейса, так как не логично в стеке иметь функцию типа push_front. Anyway, не важно кто через кого определен :) важен интерфейс, а то по твоему примеру можно использовать и vector и list.
Все таки если класс стек существует - значит это кому-то надо :)
To DaNYer: не понимаю в чем подмигивание, но сочуствую, что пишите контейнерные части на С. Такого геморроя как работа в С с "осмысленными" структурами, а не просто кусками данных, еще надо поискать :tutuz:
Agregat
Apr 3, 2003, 07:54
Уважаемый тов. Немра:
вами скзанное очевидно :)
Я согласен во многом.
Но на самом деле, если я знаю, что у меня стек, то на хрена мне использовать push_front, insert, erase, resize и т.д.Хотя последняя функция, все таки может быть и нужна.
Поэтому это как-бы защита "от дурака" :)
Гарик, выпьем?
Agregat, не сейчас - на выходные, сам знаешь ;)
Agregat
Apr 3, 2003, 10:26
Ок
Гарик,
выпьем обязательно! :)
Dream_InspectoR
Apr 4, 2003, 17:08
@nker Grigoryan в своем амплуа :devil:
kstati vot:
starcraft r u l e s
vBulletin® v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.