mirror of
https://github.com/TheAlgorithms/C
synced 2024-11-25 06:49:36 +03:00
Merge pull request #107 from christianbender/master
simple modular and generic stack
This commit is contained in:
commit
6707474f2a
39
Data Structures/stack/README.md
Normal file
39
Data Structures/stack/README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# Simple generic Stack
|
||||
|
||||
This is a modular generic stack data-structure. The stack is self growing.
|
||||
|
||||
### Content
|
||||
|
||||
* stack-Header file for import.
|
||||
* stack.c implementation of the stack
|
||||
* main.c framework program for testing.
|
||||
|
||||
You need to only import the **stack.h**
|
||||
|
||||
### Public interface
|
||||
|
||||
``` void initStack(); ```
|
||||
|
||||
Initializes the stack with a capacity of 10 elements.
|
||||
|
||||
``` void push(void * object); ```
|
||||
|
||||
pushs the argument onto the stack
|
||||
|
||||
``` void * pop(); ```
|
||||
|
||||
pop: pops the top element of the stack from the stack.
|
||||
|
||||
assumes: stack not empty.
|
||||
|
||||
``` int size(); ```
|
||||
|
||||
gets the number of elements of the stack.
|
||||
|
||||
``` int isEmpty(); ```
|
||||
|
||||
returns 1 if stack is empty otherwise 0.
|
||||
|
||||
|
||||
|
||||
|
40
Data Structures/stack/main.c
Normal file
40
Data Structures/stack/main.c
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
author: Christian Bender
|
||||
|
||||
This is the main-program for testing the stack.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "stack.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
int MAX = 55;
|
||||
int field[MAX];
|
||||
int i; /* for the loop */
|
||||
int *pInt = NULL;
|
||||
|
||||
initStack();
|
||||
|
||||
/* pushs some elements onto stack */
|
||||
for (i = 0; i < MAX; i++)
|
||||
{
|
||||
field[i] = i;
|
||||
push((field + i)); // HERE
|
||||
}
|
||||
|
||||
/* pops the elements from the stack and print that out.*/
|
||||
for (i = 0; i < MAX; i++)
|
||||
{
|
||||
pInt = pop(); /* fetch next integer */
|
||||
|
||||
printf("%d\n", *pInt); /* print value */
|
||||
}
|
||||
|
||||
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
136
Data Structures/stack/stack.c
Normal file
136
Data Structures/stack/stack.c
Normal file
@ -0,0 +1,136 @@
|
||||
/*
|
||||
author: Christian Bender
|
||||
|
||||
This is the implementation of the (generic) stack.
|
||||
The implementation uses the dynamic memory management and the principle
|
||||
of data hiding.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "stack.h"
|
||||
|
||||
/*
|
||||
actual stack data structure
|
||||
This pointer will pointing at the actual field (of void * pointers)
|
||||
that represents the stack.
|
||||
*/
|
||||
void **array;
|
||||
|
||||
/* the current capacity of the stack */
|
||||
int max = 10;
|
||||
|
||||
/* counter variable for counting the elements of the stack. */
|
||||
int counter = 0;
|
||||
|
||||
/*
|
||||
offset address
|
||||
points at the top element of the stack.
|
||||
*/
|
||||
int offset = -1;
|
||||
|
||||
void initStack()
|
||||
{
|
||||
|
||||
array = malloc(sizeof(void *) * max);
|
||||
assert(array); /* tests whether pointer is assigned to memory. */
|
||||
}
|
||||
|
||||
/*
|
||||
grow: increases the stack by 10 elements.
|
||||
This utility function isn't part of the public interface
|
||||
*/
|
||||
void grow()
|
||||
{
|
||||
max += 10; /* increases the capacity */
|
||||
|
||||
int i; // for the loop
|
||||
void **tmp = malloc(sizeof(void *) * max);
|
||||
|
||||
/* copies the elements from the origin array in the new one. */
|
||||
for (i = 0; i < max - 10; i++)
|
||||
{
|
||||
*(tmp + i) = *(array + i);
|
||||
}
|
||||
|
||||
array = tmp; /* setups the new one as basis */
|
||||
}
|
||||
|
||||
/* push: pushs the argument onto the stack */
|
||||
void push(void *object)
|
||||
{
|
||||
|
||||
assert(object); /* tests whether pointer isn't null */
|
||||
|
||||
if (counter < max)
|
||||
{
|
||||
|
||||
offset++; /* increases the element-pointer */
|
||||
|
||||
/*
|
||||
moves pointer by the offset address
|
||||
pushs the object onto stack
|
||||
*/
|
||||
*(array + offset) = object;
|
||||
|
||||
/* increases the inner counter */
|
||||
counter++;
|
||||
}
|
||||
else /* stack is full */
|
||||
{
|
||||
|
||||
grow(); /* lets grow stack */
|
||||
push(object); /* recursive call */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
pop: pops the top element of the stack from the stack.
|
||||
*/
|
||||
void *pop()
|
||||
{
|
||||
|
||||
void *top = *(array + offset);
|
||||
|
||||
/* check pointers */
|
||||
assert(top);
|
||||
|
||||
/* if use the pop-function, stack must not empty. */
|
||||
assert(!isEmpty());
|
||||
|
||||
/* decreases the offset address for pointing of
|
||||
the new top element */
|
||||
offset--;
|
||||
|
||||
/* decreases the inner counter */
|
||||
counter--;
|
||||
|
||||
return top;
|
||||
}
|
||||
|
||||
/*
|
||||
size: gets the number of elements of the stack.
|
||||
*/
|
||||
int size()
|
||||
{
|
||||
return counter;
|
||||
}
|
||||
|
||||
/*
|
||||
isEmpty(): returns 1 if stack is empty otherwise 0.
|
||||
*/
|
||||
int isEmpty()
|
||||
{
|
||||
return counter == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
top: returns the top element from the stack without removing it.
|
||||
*/
|
||||
void *top()
|
||||
{
|
||||
/* offset address points to the top element */
|
||||
return array[offset];
|
||||
}
|
43
Data Structures/stack/stack.h
Normal file
43
Data Structures/stack/stack.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
author: Christian Bender
|
||||
|
||||
This header represents the public stack-interface.
|
||||
The stack is generic and self growing.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __STACK__
|
||||
#define __STACK__
|
||||
|
||||
/*
|
||||
initStack: initializes the stack with a capacity of 10 elements.
|
||||
*/
|
||||
void initStack();
|
||||
|
||||
/*
|
||||
push: pushs the argument onto the stack
|
||||
*/
|
||||
void push(void * object);
|
||||
|
||||
/*
|
||||
pop: pops the top element of the stack from the stack.
|
||||
assumes: stack not empty.
|
||||
*/
|
||||
void * pop();
|
||||
|
||||
/*
|
||||
size: gets the number of elements of the stack.
|
||||
*/
|
||||
int size();
|
||||
|
||||
/*
|
||||
isEmpty(): returns 1 if stack is empty otherwise 0.
|
||||
*/
|
||||
int isEmpty();
|
||||
|
||||
/*
|
||||
top: returns the top element from the stack without removing it.
|
||||
*/
|
||||
void * top();
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user