|
|
|
|
|
|
![]() Chapter 19Answers to Selected Exercises2. [was #2; modified]
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
#define PUBLIC /* empty */
#define PRIVATE static
struct node {
int data;
struct node *next;
};
PRIVATE struct node *top = NULL;
PRIVATE void terminate(const char *message)
{
printf("%s\n", message);
exit(EXIT_FAILURE);
}
PUBLIC void make_empty(void)
{
while (!is_empty())
pop();
}
PUBLIC bool is_empty(void)
{
return top == NULL;
}
PUBLIC bool is_full(void)
{
return false;
}
PUBLIC void push(int i)
{
struct node *new_node = malloc(sizeof(struct node));
if (new_node == NULL)
terminate("Error in push: stack is full.");
new_node->data = i;
new_node->next = top;
top = new_node;
}
PUBLIC int pop(void)
{
struct node *old_top;
int i;
if (is_empty())
terminate("Error in pop: stack is empty.");
old_top = top;
i = top->data;
top = top->next;
free(old_top);
return i;
}
4. [was #4; modified]
(a) Contents of
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
static void terminate(const char *message)
{
printf("%s\n", message);
exit(EXIT_FAILURE);
}
void make_empty(Stack *s)
{
s->top = 0;
}
bool is_empty(const Stack *s)
{
return s->top == 0;
}
bool is_full(const Stack *s)
{
return s->top == STACK_SIZE;
}
void push(Stack *s, int i)
{
if (is_full(s))
terminate("Error in push: stack is full.");
s->contents[s->top++] = i;
}
int pop(Stack *s)
{
if (is_empty(s))
terminate("Error in pop: stack is empty.");
return s->contents[--s->top];
}
(b) Contents of
#ifndef STACK_H
#define STACK_H
#include <stdbool.h> /* C99 only */
struct node {
int data;
struct node *next;
};
typedef struct node *Stack;
void make_empty(Stack *s);
bool is_empty(const Stack *s);
bool is_full(const Stack *s);
void push(Stack *s, int i);
int pop(Stack *s);
#endif
Contents of
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
static void terminate(const char *message)
{
printf("%s\n", message);
exit(EXIT_FAILURE);
}
void make_empty(Stack *s)
{
while (!is_empty(s))
pop(s);
}
bool is_empty(const Stack *s)
{
return *s == NULL;
}
bool is_full(const Stack *s)
{
return false;
}
void push(Stack *s, int i)
{
struct node *new_node = malloc(sizeof(struct node));
if (new_node == NULL)
terminate("Error in push: stack is full.");
new_node->data = i;
new_node->next = *s;
*s = new_node;
}
int pop(Stack *s)
{
struct node *old_top;
int i;
if (is_empty(s))
terminate("Error in pop: stack is empty.");
old_top = *s;
i = (*s)->data;
*s = (*s)->next;
free(old_top);
return i;
}
Copyright © 2008, 1996 W. W. Norton & Company, Inc. All rights reserved. |