栈
1、栈是否可以遍历?
不可以遍历
2、遍历:不重复不遗漏访问容器中每个元素,访问之后元素不会发生改变——非质变算法
3、栈底——高地址,栈顶——低地址
顺序栈
1、数组的首地址,做栈顶还是作栈底?
首地址端做 栈底,原因是 栈顶频繁做入栈和出栈操作,对于数组尾部做插入删除效率高
2、接口
(1)初始化栈
(2)入栈
(3)出栈
(4)返回栈顶元素
(5)栈大小
(6)栈是否为空
(7)销毁栈
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "seqStack.h"
#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 - 1] = NULL;
mystack->m_Size--;
}
void * top_SeqStack(SeqStack stack)
{
if (stack == NULL)
{
return NULL;
}
struct SStack * mystack = stack;
if (mystack->m_Size == 0)
{
return NULL;
}
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;
if (mystack->m_Size == 0)
{
return 1;
}
return 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", 10 };
struct Person p2 = {
"bbb", 20 };
struct Person p3 = {
"ccc", 30 };
struct Person p4 = {
"ddd", 40 };
struct Person p5 = {
"eee", 50 };
push_SeqStack(myStack, &p1);
push_SeqStack(myStack, &p2);
push_SeqStack(myStack, &p3);
push_SeqStack(myStack, &p4);
push_SeqStack(myStack, &p5);
printf("栈的元素个数为:%d\n", size_SeqStack(myStack));
while (isEmpty_SeqStack(myStack) == 0)
{
struct Person * p = top_SeqStack(myStack);
printf("姓名:%s 年龄:%d\n", p->name, p->age);