一、顺序存储结构实现
栈的实现比较简单,主要是存储方式有顺序存储和链式存储两种。在结构体定义上,可以直接分配数组大小,定义栈空间;也可以在结构体定义中,使用指针,再在初始化栈时分配空间。
(1)结构体定义中使用数组
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define MAX_DATA_NUM 100
typedef struct {
int pop;
int data[MAX_DATA_NUM];
} StackData;
StackData* CreateStack(void)
{
StackData* stack = (StackData*)malloc(sizeof(StackData));
if (stack == NULL) {
return NULL;
}
stack->pop = 0;
for (int i = 0; i < MAX_DATA_NUM; i++) {
stack->data[i] = 0;
}
return stack;
}
bool IsEmpty(StackData* stackdata)
{
if (stackdata == NULL) {
return true;
} else {
if (stackdata->pop == 0) {
return true;
} else {
return false;
}
}
}
bool IsFull(StackData* stackdata)
{
if (stackdata == NULL) {
return false;
} else {
if (stackdata->pop == MAX_DATA_NUM) {
return true;
} else {
return false;
}
}
}
bool AddElment(StackData* stackdata, int data)
{
if (IsFull(stackdata) == true) {
printf("Add element failed! Stack is full.\n");
return false;
}
stackdata->data[stackdata->pop] = data;
stackdata->pop++;
return true;
}
bool DeleteElment(StackData* stackdata)
{
if (IsEmpty(stackdata) == true) {
printf("Delete element failed! Stack is empty.\n");
return false;
}
stackdata->pop--;
return true;
}
void VisitStack(StackData* stackdata)
{
for (int i = 0; i < stackdata->pop; i++) {
printf("%d ", stackdata->data[i]);
}
printf("\n");
return ;
}
void main(void)
{
StackData* mystack = CreateStack();
AddElment(mystack, 1);
AddElment(mystack, 2);
AddElment(mystack, 3);
AddElment(mystack, 4);
AddElment(mystack, 5);
VisitStack(mystack);
DeleteElment(mystack);
VisitStack(mystack);
DeleteElment(mystack);
DeleteElment(mystack);
VisitStack(mystack);
}
(2)结构体定义中使用指针
#include "stdlib.h"
#include "stdbool.h"
#include "stdio.h"
#define MAX_DATA_NUM 100
typedef struct {
int pop;
int* data;
} StackData;
StackData* CreateStack(void)
{
StackData* stackdata = (StackData*)malloc(sizeof(StackData));
if (stackdata == NULL) {
return NULL;
}
stackdata->pop = 0;
stackdata->data = (int*)malloc(sizeof(int) * MAX_DATA_NUM);
return stackdata;
}
bool IsEmpty(StackData* stackdata)
{
if (stackdata == NULL) {
return true;
} else {
if (stackdata->pop == 0) {
return true;
} else {
return false;
}
}
}
bool IsFull(StackData* stackdata)
{
if (stackdata == NULL) {
return false;
} else {
if (stackdata->pop == MAX_DATA_NUM) {
return true;
} else {
return false;
}
}
}
bool AddElment(StackData* stackdata, int data)
{
if (IsFull(stackdata) == true) {
printf("Add element failed! Stack is full.\n");
return false;
} else {
stackdata->data[stackdata->pop] = data;
stackdata->pop++;
return true;
}
}
bool DeleteElment(StackData* stackdata)
{
if (IsEmpty(stackdata) == true) {
printf("Delete element failed! Stack is empty.\n");
return false;
} else {
stackdata->pop--;
return true;
}
}
void VisitStack(StackData* stackdata)
{
for (int i = 0; i < stackdata->pop; i++) {
printf("%d ", stackdata->data[i]);
}
printf("\n");
return ;
}
void main(void)
{
StackData* mystack = CreateStack();
DeleteElment(mystack);
AddElment(mystack, 1);
AddElment(mystack, 2);
AddElment(mystack, 3);
AddElment(mystack, 4);
AddElment(mystack, 5);
VisitStack(mystack);
DeleteElment(mystack);
VisitStack(mystack);
DeleteElment(mystack);
DeleteElment(mystack);
VisitStack(mystack);
}