参照算法第四版写的基于数组的可扩容与缩容的栈实现。
非 -字符入栈,-字符出栈。
接口申明文件:stack_array.h
#ifndef __STACK_ARRAY_H__
#define __STACK_ARRAY_H__
extern int stack_array_size;
void arraystackpush(char** parray, char value);
char arraystackpop(char** parray);
char* resizestack(char* poldstack, int capacity);
int arraystacksize();
int arraystackcapacity();
char* arraystackcreate(int capacity);
int arraystackisempty();// 1 empty, 0 not empty
#endif
接口实现文件:stack_array.c
#include "stack_array.h"
#include <stdlib.h>
#include <stdio.h>
int stack_array_size = 0;
int stack_array_capacity = 0;
char* arraystackcreate(int capacity)
{
char* pstack = NULL;
if(0 >= capacity)
{
return NULL;
}
pstack = (char*)malloc(sizeof(char) * capacity);
if(NULL == pstack)
{
return NULL;
}
stack_array_capacity = capacity;
return pstack;
}
int arraystackcapacity()
{
return stack_array_capacity;
}
int arraystacksize()
{
return stack_array_size;
}
int arraystackisempty()
{
if(0 >= stack_array_size)
{
return 1;
}
else
{
return 0;
}
}
char arraystackpop(char** pparray)
{
if(0 >= stack_array_size)
{
return -1;
}
if(stack_array_size <= stack_array_capacity/4)
{
*pparray = resizestack((char*)*pparray, stack_array_capacity/2);
printf("after shrink, the capacity is %d\n", stack_array_capacity);
}
return (*pparray)[--stack_array_size];
}
void arraystackpush(char** pparray, char value)
{
(*pparray)[stack_array_size++] = value;
if(stack_array_size >= stack_array_capacity)
{
*pparray = resizestack(*pparray, 2 * stack_array_capacity);
printf("after extend, the capacity is %d\n", stack_array_capacity);
}
}
char* resizestack(char* poldstack, int capacity)
{
int index = 0;
char* pnewstack = (char*)malloc(sizeof(char) * capacity);
if(NULL == pnewstack)
{
return NULL;
}
stack_array_capacity = capacity;
for(index = 0; index < stack_array_size; index++)
{
pnewstack[index] = poldstack[index];
}
free(poldstack);
return pnewstack;
}
测试的的main.c文件:
#include "stack_array.h"
#include <stdio.h>
#include <string.h>
int main ()
{
char c;
char* pstack = arraystackcreate(10);
int i = 0;
for(i = 0; i < 100; i++)
{
//scanf("%c", &c);
c = getchar();
if ('-' != c && '\n' != c)
{
arraystackpush(&pstack, c);
printf("after push, stack size is:%d, capacity is:%d, input char is:%c\n", arraystacksize(), arraystackcapacity(), c);
}
else if('-' == c)
{
printf("after pop, stack size is:%d, capacity is:%d, output char is:%c\n", arraystacksize(), arraystackcapacity(), arraystackpop(&pstack));
}
else if('\n' == c)
{
continue;
}
//printf("count i = %d\n", i);
}
printf("test successfully\n");
return 0;
}