栈的顺序存储
栈的设计
栈的结构体
#define MAX 1024
struct SStack
{
void* data[MAX];
int m_Size;
};
typedef void* SeqStack;
初始化栈
SeqStack init_SeqStack()
{
struct SStack* myStack = malloc(sizeof(struct SStack));
if (myStack == NULL)
{
return NULL;
}
memset(myStack->data, 0, sizeof(void*) * MAX);
myStack->m_Size = 0;
return myStack;
}
入栈
void push_SeqStack(SeqStack stack, void* data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct SStack* myStack = stack;
if (myStack->m_Size == MAX)
{
return;
}
myStack->data[myStack->m_Size] = data;
myStack->m_Size++;
}
出栈
void pop_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
struct SStack* myStack = stack;
if (myStack->m_Size == 0)
{
return;
}
myStack->data[myStack->m_Size] = NULL;
myStack->m_Size--;
}
返回栈顶
void* top_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
struct SStack* myStack = stack;
if (myStack->m_Size == 0)
{
return;
}
return myStack->data[myStack->m_Size - 1];
}
返回栈大小
int size_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct SStack* myStack = stack;
return myStack->m_Size;
}
判断栈是否为空
int isEmpty_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return -1;
}
struct SStack* myStack = stack;
return myStack->m_Size == 0;
}
销毁栈
void destroy_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return;
}
free(stack);
stack = NULL;
}
测试
struct Person
{
char name[64];
int age;
};
void test01()
{
SeqStack myStack = init_SeqStack();
struct Person p1 = { "aaa",18 };
struct Person p2 = { "bbb",19 };
struct Person p3 = { "ccc",16 };
struct Person p4 = { "ddd",13 };
struct Person p5 = { "eee",14 };
struct Person p6 = { "fff",20 };
push_SeqStack(myStack, &p1);
push_SeqStack(myStack, &p2);
push_SeqStack(myStack, &p3);
push_SeqStack(myStack, &p4);
push_SeqStack(myStack, &p5);
push_SeqStack(myStack, &p6);
printf("栈的大小: %d\n", size_SeqStack(myStack));
while (isEmpty_SeqStack(myStack) == 0)
{
struct Person* pTop = top_SeqStack(myStack);
printf("name: %s, age: %d\n", pTop->name, pTop->age);
pop_SeqStack(myStack);
printf("栈的大小: %d\n", size_SeqStack(myStack));
}
destroy_SeqStack(myStack);
}
栈的链式存储
设计
节点结构体
struct LinkNode
{
struct LinkNode* next;
};
栈的结构体
struct LStack
{
struct LinkNode pHeader;
int m_Size;
};
typedef void* LinkStack;
初始化栈
LinkStack init_LinkStack()
{
struct LStack * myStack = malloc(sizeof(struct LStack));
if (myStack == NULL)
{
return NULL;
}
myStack->pHeader.next = NULL;
myStack->m_Size = 0;
return myStack;
}
入栈
void push_LinkStack(LinkStack stack, void* data)
{
if (stack == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct LStack* myStack = stack;
struct LinkNode* myNode = data;
myNode->next = myStack->pHeader.next;
myStack->pHeader.next = myNode;
myStack->m_Size++;
}
出栈
void pop_LinkStack(LinkStack stack)
{
if (stack == NULL)
{
return;
}
struct LStack* myStack = stack;
if (myStack->m_Size == 0)
{
return;
}
struct LinkNode* pFirst = myStack->pHeader.next;
myStack->pHeader.next = pFirst->next;
myStack->m_Size--;
}
返回栈顶
void* top_LinkStack(LinkStack stack)
{
if (stack == NULL)
{
return;
}
struct LStack* myStack = stack;
if (myStack->m_Size == 0)
{
return;
}
return myStack->pHeader.next;
}
返回栈大小
int size_LinkStack(LinkStack stack)
{
if (stack == NULL)
{
return -1;
}
struct LStack* myStack = stack;
return myStack->m_Size;
}
判断栈是否为空
int isEmpty_LinkStack(LinkStack stack)
{
if (stack == NULL)
{
return -1;
}
struct LStack* myStack = stack;
return myStack->m_Size == 0;
}
销毁栈
void destroy_LinkStack(LinkStack stack)
{
if (stack == NULL)
{
return ;
}
free(stack);
stack = NULL;
}
测试
struct Person
{
char* a;
char name[64];
int age;
};
void test01()
{
LinkStack myStack = init_LinkStack();
struct Person p1 = {NULL, "aaa",18 };
struct Person p2 = {NULL, "bbb",19 };
struct Person p3 = {NULL, "ccc",16 };
struct Person p4 = {NULL, "ddd",13 };
struct Person p5 = {NULL, "eee",14 };
struct Person p6 = {NULL, "fff",20 };
push_LinkStack(myStack, &p1);
push_LinkStack(myStack, &p2);
push_LinkStack(myStack, &p3);
push_LinkStack(myStack, &p4);
push_LinkStack(myStack, &p5);
push_LinkStack(myStack, &p6);
printf("栈的大小: %d\n", size_LinkStack(myStack));
while (isEmpty_LinkStack(myStack) == 0)
{
struct Person* pTop = top_LinkStack(myStack);
printf("LinkStack name: %s, age: %d\n", pTop->name, pTop->age);
pop_LinkStack(myStack);
printf("栈的大小: %d\n", size_LinkStack(myStack));
}
destroy_LinkStack(myStack);
}
队列的顺序存储
设计
初始化队列
SeqQueue init_SeqQueue()
{
struct dynamicArray* array = init_dynamicArray(MAX);
return array;
}
入队
void push_SeqQueue(SeqQueue queue, void* data)
{
if (queue == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct dynamicArray* array = queue;
if (array->m_Size == MAX)
{
return;
}
insert_dynamicArray(array, data, array->m_Size);
}
出队
void pop_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return;
}
struct dynamicArray* array = queue;
if (array->m_Size == 0)
{
return;
}
removeByPos_dynamicArray(array, 0);
}
返回队头
void* front_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct dynamicArray* array = queue;
return array->pAddr[0];
}
返回队尾
void* back_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct dynamicArray* array = queue;
return array->pAddr[array->m_Size-1];
}
返回队列大小
int size_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct dynamicArray* array = queue;
return array->m_Size;
}
判断队列是否为空
int isEmpty_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct dynamicArray* array = queue;
return array->m_Size == 0;
}
销毁队列
void destroy_SeqQueue(SeqQueue queue)
{
if (queue == NULL)
{
return ;
}
destroy_dynamicArray(queue);
}
测试
struct Person
{
char name[64];
int age;
};
void test01()
{
SeqQueue queue = init_SeqQueue();
struct Person p1 = { "aaa",10 };
struct Person p2 = { "bbb",11 };
struct Person p3 = { "ccc",12 };
struct Person p4 = { "ddd",13 };
struct Person p5 = { "eee",14 };
push_SeqQueue(queue, &p1);
push_SeqQueue(queue, &p2);
push_SeqQueue(queue, &p3);
push_SeqQueue(queue, &p4);
push_SeqQueue(queue, &p5);
while (isEmpty_SeqQueue(queue) == 0)
{
struct Person * pFront = front_SeqQueue(queue);
printf(" Front name: %s, age: %d\n", pFront->name, pFront->age);
struct Person* pBack = back_SeqQueue(queue);
printf(" Back name: %s, age: %d\n", pBack->name, pBack->age);
pop_SeqQueue(queue);
}
destroy_SeqQueue(queue);
}
队列的链式存储
设计
struct LinkNode
{
struct LinkNode* next;
};
struct LQueue
{
struct LinkNode pHeader;
int m_Size;
struct LinkNode* pTail;
};
typedef void* LinkQueue;
初始化
LinkQueue init_LinkQueue()
{
struct LQueue* queue = malloc(sizeof(struct LQueue));
if (queue == NULL)
{
return NULL;
}
queue->pHeader.next = NULL;
queue->m_Size = 0;
queue->pTail = &queue->pHeader;
return queue;
}
入队
void push_LinkQueue(LinkQueue queue, void* data)
{
if (queue == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct LQueue* myQueue = queue;
struct LinkNode* myNode = data;
myQueue->pTail->next = myNode;
myNode->next = NULL;
myQueue->pTail = myNode;
myQueue->m_Size++;
}
出队
void pop_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
struct LQueue* myQueue = queue;
if (myQueue->m_Size == 0)
{
return;
}
if (myQueue->m_Size == 1)
{
myQueue->pHeader.next = NULL;
myQueue->pTail = &(myQueue->pHeader);
myQueue->m_Size--;
return;
}
struct LinkNode* pFirt = myQueue->pHeader.next;
myQueue->pHeader.next = pFirt->next;
myQueue->m_Size--;
}
返回队头元素
void* front_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct LQueue* myQueue = queue;
if (myQueue->m_Size == 0)
{
return NULL;
}
return myQueue->pHeader.next;
}
返回队尾元素
void* back_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return NULL;
}
struct LQueue* myQueue = queue;
if (myQueue->m_Size == 0)
{
return NULL;
}
return myQueue->pTail;
}
返回队列大小
int size_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct LQueue* myQueue = queue;
return myQueue->m_Size;
}
判断队列是否为空
int isEmpty_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return -1;
}
struct LQueue* myQueue = queue;
return myQueue->m_Size == 0;
}
销毁队列
void destroy_LinkQueue(LinkQueue queue)
{
if (queue == NULL)
{
return;
}
free(queue);
queue = NULL;
}
测试
struct Person
{
char* a;
char name[64];
int age;
};
void test01()
{
LinkQueue queue = init_LinkQueue();
struct Person p1 = { NULL,"aaa",10 };
struct Person p2 = { NULL,"bbb",11 };
struct Person p3 = { NULL,"ccc",12 };
struct Person p4 = { NULL,"ddd",13 };
struct Person p5 = { NULL,"eee",14 };
push_LinkQueue(queue, &p1);
push_LinkQueue(queue, &p2);
push_LinkQueue(queue, &p3);
push_LinkQueue(queue, &p4);
push_LinkQueue(queue, &p5);
while (isEmpty_LinkQueue(queue) == 0)
{
struct Person* pFront = front_LinkQueue(queue);
printf(" Front name: %s, age: %d\n", pFront->name, pFront->age);
struct Person* pBack = back_LinkQueue(queue);
printf(" Back name: %s, age: %d\n", pBack->name, pBack->age);
pop_LinkQueue(queue);
printf("size: %d\n", size_LinkQueue(queue));
}
destroy_LinkQueue(queue);
}