스택 구현
스택, 배열로 구현
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
#define INIT_CAPACITY 100
typedef int Item;
typedef struct stack_type *Stack;
Stack create();
void destroy(Stack s);
void make_empty(Stack s);
bool is_empty(Stack s);
bool is_full(Stack s);
void push(Stack s,Item i);
Item pop(Stack s);
Item peek(Stack s);
struct stack_type{
Item *contents;
int top;
int size;
};
static void terminate(const char* message)
{
printf("%s\n",message);
exit(1);
}
Stack create()
{
Stack s = (Stack)malloc(sizeof(sizeof(struct stack_type)));
if(s==NULL)
{
terminate("Error in create: stack could not be created");
}
s->contents=(Item*)malloc(INIT_CAPACITY*sizeof(Item));
if(s->contents==NULL)
{
free(s);
terminate("Error in create: stack coud not be created.");
}
s->top=-1;
s->size=INIT_CAPACITY;
return s;
}
void destroy(Stack s)
{
free(s->contents);
free(s);
}
void make_empty(Stack s)
{
s->top=-1;
}
bool is_empty(Stack s)
{
return s->top ==-1;
}
bool is_full(Stack s)
{
return s->top==s->size-1;
}
void push(Stack s,Item item)
{
if(is_full(s))
{
reallocate(s);
}
s->contents[s->top]=item;
}
Item pop(Stack s)
{
if(is_empty(s))
terminate("Error in popL stack is empty");
s->top--;
return s->contents[s->top+1];
}
Item peek(Stack s)
{
if(is_empty(s))
terminate("Error in peek: stack is empty");
return s->contents[s->top];
}
void reallocate(Stack s)
{
Item *tmp=(Item*)malloc(2*s->size*sizeof(Item));
if(tmp==NULL)
{
terminate("Error in create: stack could not be created");
}
for(int i=0;i<s->size;i++)
tmp[i]=s->contents[i];
free(s->contents);
s->contents=tmp;
s->size*=2;
}
int main()
{
Stack s1=create();
Stack s2=create();
push(s1,2);
push(s2,3);
}
스택, 연결리스트 구현
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
#define INIT_CAPACITY 100
typedef int Item;
typedef struct stack_type *Stack;
Stack create();
void destroy(Stack s);
void make_empty(Stack s);
bool is_empty(Stack s);
bool is_full(Stack s);
void push(Stack s,Item i);
Item pop(Stack s);
Item peek(Stack s);
struct node{
Item data;
struct node* next;
};
struct stack_type
{
struct node* top;
};
static void terminate(const char* message)
{
printf("%s\n",message);
exit(1);
}
Stack create()
{
Stack s = (Stack)malloc(sizeof(sizeof(struct stack_type)));
if(s==NULL)
{
terminate("Error in create: stack could not be created");
}
s->top=NULL;
return s;
}
void destroy(Stack s)
{
free(s);
}
void make_empty(Stack s)
{
while(!is_empty(s))
pop(s);
}
bool is_empty(Stack s)
{
return s->top ==NULL;
}
void push(Stack s,Item item)
{
struct node* new_node = (struct node*)malloc(sizeof(struct node));
if(new_node==NULL)
terminate("Error in push: stack is full");
new_node->data=item;
new_node->next=s->top;
s->top=new_node;
}
Item pop(Stack s)
{
if(is_empty(s))
terminate("Error in popL stack is empty");
Item old_node = s->top->data;
s->top=s->top->next;
return old_node;
}
Item peek(Stack s)
{
if(is_empty(s))
terminate("Error in peek: stack is empty");
return s->top->data;
}
int main()
{
Stack s1=create();
Stack s2=create();
push(s1,2);
push(s2,3);
}
댓글