Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters > Algorithms
Register

Reply
 
LinkBack Thread Tools
Old 30.03.2003, 21:09   #1
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Question [PLEASE HELP ASAP] Stacks

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:

Code:
//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

Code:
#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;
	}
}

Last edited by DaNYer; 30.03.2003 at 23:20.
Reply With Quote
Old 31.03.2003, 05:47   #2
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

странно, что у тебя вообще что-то работает

STACK *s1;
STACK *s2;

означает, что у тебя есть лишь указатели (а не реальные данные) - на что они указывают, DaNYer ?

черт-те знает на что.


STACK s1_data;
STACK s2_data;

STACK *s1 = &s1_data;
STACK *s2 = &s2_data;


вот тока после этого...
Reply With Quote
Old 31.03.2003, 06:53   #3
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Gar jan, privet
oni ukazivaiut na structure - stack

....

ya spat' poidu, pozdno ujo...

do zavtra
Reply With Quote
Old 31.03.2003, 07:52   #4
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

Quote:
Originally posted by DaNYer
Gar jan, privet
oni ukazivaiut na structure - stack

....

ya spat' poidu, pozdno ujo...

do zavtra
привет-привет
исходя из этого кода, я все-таки настаиваю на том, что указатели у тебя указывают на что угодно, но не на существующие структуры.

Code:
void main ()
{
	int test1, test2;
	STACK *s1;
	STACK *s2;
	init(s1);
	init(s2);

...

я на твоем месте "new" бы делал
или завел бы переменные типа STACK, а не STACK*.
Reply With Quote
Old 01.04.2003, 06:10   #5
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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.....
Reply With Quote
Old 01.04.2003, 07:45   #6
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

Вот тебе работающий код:


Quote:
Originally posted by Greco
странно, что у тебя вообще что-то работает

STACK *s1;
STACK *s2;

означает, что у тебя есть лишь указатели (а не реальные данные) - на что они указывают, DaNYer ?

черт-те знает на что.


STACK s1_data;
STACK s2_data;

STACK *s1 = &s1_data;
STACK *s2 = &s2_data;


вот тока после этого...
Reply With Quote
Old 01.04.2003, 08:45   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Гарик, ты тоже муру написал...

s1 = new STACK;
s2 = new STACK;
...
delete s1;
delete s2;
//все, как у людей.... если же уже
STACK s1;
STACK s2;
то создавать указатели излишне:
push(&s1, 3);
Reply With Quote
Old 01.04.2003, 15:21   #8
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
Reply With Quote
Old 01.04.2003, 22:34   #9
Дошкольник
 
Nemra's Avatar
 
Join Date: 07 2002
Location: South Park
Posts: 82
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally posted by DaNYer
rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
Извините за цинизм, не удержался...
На лицо... или на лице, конфликт цивилизаций: Евразия поясняет суть проблемы и дает множество (причем правильных) решений, а Америка все твердит - НЕТ, эта программа не работает. Остается одно, бомбить эту программу, что бы свергнуть ненавистный баг, который только она и видит! Хотя весь баг в том, что та же Америка подходит к решения своими методами (причем неверными в корне) и твердо стоит на своем
Ну что же, удачи тебе, Америка, в твоем крестовом (на который положили крест) походе
Reply With Quote
Old 02.04.2003, 06:21   #10
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

Quote:
Originally posted by DaNYer
rebyataaaaaaaaaaaaaaa spasibo konechno, no vse ravno programma vidit toka odin stack a ne dva......
извини, тогда я просто умываю руки.

2 Nemra: тебе бы в Политикс..
Reply With Quote
Old 02.04.2003, 14:56   #11
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

&
Reply With Quote
Old 02.04.2003, 14:59   #12
Banned
 
DaNYer's Avatar
 
Join Date: 10 2002
Location: Brooklyn, New York
Age: 39
Posts: 3,760
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

vot i vsya problema...

spasibo rebyata

razbombil konechno i nashel
(razumeetsya ya ispol'zoval bombi i krilatie raketi VISOKOI TOCHNOSTI)

Vit', ukazateli vse taki nujni...

sorry chto usomnilsya

Nemra, tebe slovo
Reply With Quote
Old 02.04.2003, 15:15   #13
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

По-моему не надо... пришли мне на майл верию с указателями я ее переделаю так, что будет пахать без них!
Reply With Quote
Old 02.04.2003, 16:07   #14
Дошкольник
 
Nemra's Avatar
 
Join Date: 07 2002
Location: South Park
Posts: 82
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
Originally posted by DaNYer
vot i vsya problema...

spasibo rebyata

razbombil konechno i nashel
(razumeetsya ya ispol'zoval bombi i krilatie raketi VISOKOI TOCHNOSTI)

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;
}
__________________
std::for_each( users.begin(), users.end(), std::bind2nd( std::mem_fun(&ForumMember::sendMessage), "Hello"))
Reply With Quote
Old 02.04.2003, 16:18   #15
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

std::stack и std::queue ведь не являются на самом деле классами, они просто обертки вокруг std::deque, или чего-нить еще если вставить второй template параметер.
Так что можно еще проще
Code:
#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;
}
Вот
Reply With Quote
Sponsored Links
Reply

« :-) | Stolbi »
Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 02:59.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.