Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Stack на C


Автор: Just_Girl 6.12.2007, 15:05
Привет! Help!!! Есть ли у кого то имплементатия Stack'a u16 на C???  smile

Автор: Greeen 6.12.2007, 15:19
Цитата(Just_Girl @  6.12.2007,  15:05 Найти цитируемый пост)
имплементатия

 smile это что, модно сейчас так говорить?

Добавлено через 23 секунды
Куда ни плюнь везде одна имплементация

Автор: Just_Girl 6.12.2007, 15:34
Green << Не нуждаюсь в ваших комментах, нужна помощь!!!

Автор: baldina 6.12.2007, 23:50
Мммм... давненько на С не приходилось. Даж интересно попробовать.

Такое пойдет? Стек простейший, на односвязном списке.
Остальное добавить по вкусу

Код

#include <stdio.h>
#include <stdlib.h>

typedef unsigned short u16;

typedef struct _node_u16 {
  u16 value;
  struct _node_u16 *prev;
} node_u16;

typedef struct {
  node_u16 *top;
} stack_u16;

void init (stack_u16 *s)
{
  s->top = NULL;
}

void push (stack_u16 *s, u16 value)
{
  node_u16 *node = malloc (sizeof (node_u16));
  node->value = value;
  node->prev = s->top;
  s->top = node;
}

void pop (stack_u16 *s)
{
  if (s->top)
  {
    node_u16 *n = s->top;
    s->top = s->top->prev;
    free (n);
  }
}

int is_empty (stack_u16 *s)
{
  return s->top == NULL;
}

u16 top (stack_u16 *s)
{
  if (! is_empty(s))
    return s->top->value;
  else 
    return -1;
}

stack_u16 *new_stack_u16 (void)
{
  stack_u16 *s = malloc (sizeof (stack_u16));
  init (s);
  return s;
}

void delete_stack_u16 (stack_u16 *s)
{
  while (!is_empty (s))
    pop (s);
  free (s);
}

int main (void)
{
  u16 i;

  stack_u16 *s = new_stack_u16 ();

  for (i=0; i < 20; ++i)
    push (s, i);

  while (! is_empty (s))
  {
    printf ("%u\n", top(s));
    pop(s);
  }

  delete_stack_u16 (s);
}


Автор: Just_Girl 7.12.2007, 16:17
Извиняюсь, что не написала подробней... Речь идет о stack'e сделанном из array's.... Так как я делаю игру в которой мне надо сравнивать номера танцев двух зверюшек. smile  И я хотела танцы одного зверька в stack и танцы другово, а потом поп() и сравнить их smile

Автор: baldina 7.12.2007, 16:29
> сделанном из array's
зачем? какого именно? т.е. с каким интерфейсом? Если речь идет просто о С arrays, то надо заранее определиться, известен ли максимальный размер массива (и соотв. стека). Если он известен, все очень просто.

Танцы зверюшек это круто. Нельзя ли поподробней? В какой момент появляются номера танцев, можно ли их сравнивать сразу, зачем их вообще сравнивать. Не исключено, что есть более простой и изящный путь, чем использование стека.

Почему именно массив? Если уже есть некий массив, в котором искомые номера хранятся, почему нельзя выполнить сравнение непосредственно, не прибегая к промежуточному хранению данных?

Автор: baldina 7.12.2007, 18:03
Ну вот была минутка, получилось и с массивом известной длины. 

Код

#include <stdio.h>
#include <stdlib.h>

typedef unsigned short u16;

#define MAX_STACK_SIZE  100

typedef struct {
  u16 array[MAX_STACK_SIZE];
  int pointer;
} stack_u16;

void init (stack_u16 *s)
{
  s->pointer = -1;
}

void push (stack_u16 *s, u16 value)
{
  if (s->pointer < MAX_STACK_SIZE-1)
    s->array[++s->pointer] = value;
}

void pop (stack_u16 *s)
{
  if (s->pointer >= 0)
    --s->pointer;
}

int is_empty (stack_u16 *s)
{
  return s->pointer == -1;
}

u16 top (stack_u16 *s)
{
  if (! is_empty(s))
    return s->array[s->pointer];
  else 
    return -1;
}

int main (void)
{
  u16 i;

  stack_u16 s;
  init (&s);

  for (i=0; i < 20; ++i)
    push (&s, i);

  while (! is_empty (&s))
  {
    printf ("%u\n", top(&s));
    pop(&s);
  }

  return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)