Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ Visual Studio] Стек


Автор: Ололо 16.10.2012, 00:15
Помогите с заданием, нужно ввести символы, формируя из них стек, а затем удалить максимальный элемент.

Автор: t_gran 17.10.2012, 10:08
Код

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

struct TStack
{
   unsigned char ch;
   struct TStack* next;
};

//----------------------------------------------//
struct TStack* Push(struct TStack** stack, unsigned char ch)
{
   struct TStack* node = malloc(sizeof(struct TStack));
   node->ch = ch;
   node->next = *stack;
   
   *stack = node;

   return *stack;
}
//----------------------------------------------//
struct TStack* Pop(struct TStack** stack)
{
   struct TStack* node = *stack;
   *stack = (*stack)->next;

   free(node);
   
   return *stack;
}
//----------------------------------------------//
void Print(struct TStack* stack)
{
   while (stack)
   {
      printf("[%c=%03u] ", stack->ch, (unsigned) stack->ch);
      stack = stack->next;
   }
   printf("\n");
}
//----------------------------------------------//
struct TStack* Max(struct TStack* stack, struct TStack** prev)
{
   if (prev != NULL)
   {
      *prev = NULL;
   }
   
   struct TStack* max = stack;
   
   for (; stack && stack->next; stack = stack->next)
   {
      if (max->ch < stack->next->ch)
      {
         max = stack->next;
         
         if (prev != NULL)
         {
            *prev = stack;
         }
      }
   }
   
   return max;
}
//----------------------------------------------//
bool DeleteMax(struct TStack** stack)
{
   struct TStack* prev = NULL;
   struct TStack* node = Max(*stack, &prev);
   
   if (node == NULL)
   {
      return false;
   }
   
   if (prev == NULL)
   {
      Pop(stack);
   }
   else
   {
      struct TStack* tmp = node;
      
      prev->next = tmp->next;
      
      free(tmp);
   }
   
   return true;
}
//----------------------------------------------//

int main(int argc, const char** argv)
{
   struct TStack* stack = NULL;
   
   unsigned char ch;

   while ((ch = getchar()) != '\n')
   {
      Push(&stack, ch);
   }

   if (stack == NULL)
   {
      return EXIT_FAILURE;
   }
   
   Print(stack);

   DeleteMax(&stack);

   Print(stack);

   return EXIT_SUCCESS;
}

http://s1.ipicture.ru/

Автор: Ололо 17.10.2012, 19:29
Спасибо огромное, выручил!!!

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