栈的原理图

基于顺序存储实现栈
#define OK 1
#define ERROR 0
#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemtype;
typedef struct Stack{
int top; // 栈顶指针
SElemtype data[MAXSIZE];
}ZStack ;
- 初始化
/**
初始化栈
*/
Status InitStatck(ZStack* stack){
stack->top = -1;
return OK;
}
- 清空栈空间
/**
清空栈空间 栈顶置为-1 就好
*/
Status ClaerStatck(ZStack* stack){
stack->top = -1;
return OK;
}
- 判断栈是否为空
BOOL StatusEmpty(ZStack stack){
if (stack.top == -1) {
return TRUE;
}else{
return FALSE;
}
}
- 栈内元素数量
int StatckLength(ZStack stack){
return stack.top + 1;
}
- 栈顶元素
Status GetTop(ZStack stack,SElemtype* value){
if ((stack).top == -1) {
return ERROR;
}
*value = (stack).data[stack.top];
return OK;
}
- 入栈
Status Push(ZStack* stack, SElemtype value){
if (stack->top == MAXSIZE - 1) {
return ERROR;
}
stack->data[++stack->top] = value;
return OK;
}
- 出栈
Status Pop(ZStack* stack, SElemtype* value){
if (stack->top == -1) {
return -1;
}
*value = stack->data[stack->top--];
return OK;
}
- 遍历
Status StackTraverse(ZStack stack){
if (stack.top == -1) {
return ERROR;
}
printf("ZStack begin\n");
for (int i = 0; i <= stack.top; i++) {
printf(" %d", stack.data[i]);
}
printf("\n ZStack end\n");
return OK;
}
验证输入为:

基于链式存储实现栈
typedef int Status;
typedef int SElemtype;
typedef struct StackNode{
SElemtype data;
struct StackNode* next;
}StackNode;
typedef StackNode* LinkStackPtr;
typedef struct Stack{
LinkStackPtr top; // 栈顶指针
int count;
}ZStack ;
- 初始化
/**
初始化栈
*/
Status InitStatck(ZStack* stack){
stack->top = NULL;
stack->count = 0;
return OK;
}
- 清空栈空间
/**
清空栈空间 栈顶置为-1 就好
*/
Status ClaerStatck(ZStack* stack){
LinkStackPtr p,q;
p = stack->top;
while (p) {
q = p->next;
free(p);
p = q;
}
stack->count = 0;
return OK;
}
- 判断栈是否为空
BOOL StatusEmpty(ZStack stack){
if (stack.count == 0) {
return TRUE;
}else{
return FALSE;
}
}
- 栈内元素数量
int StatckLength(ZStack stack){
return stack.count ;
}
- 栈顶元素
Status GetTop(ZStack stack,SElemtype* value){
if ((stack).top == NULL) {
return ERROR;
}
*value = stack.top->data;
return OK;
}
- 入栈
Status Push(ZStack* stack, SElemtype value){
LinkStackPtr temp = (StackNode*)malloc(sizeof(StackNode));
temp->data = value;
temp->next = stack->top;
stack->top = temp;
stack->count ++;
return OK;
}
- 出栈
Status Pop(ZStack* stack, SElemtype* value){
if (stack->count == 0) {
return ERROR;
}
*value = stack->top->data;
LinkStackPtr temp = stack->top->next;
free(stack->top);
stack->top = temp;
stack->count --;
return OK;
}
- 遍历
Status StackTraverse(ZStack stack){
if (stack.count == 0) {
return ERROR;
}
LinkStackPtr temp = stack.top;
printf("ZStack begin\n");
while (temp) {
printf(" %d", temp->data);
temp = temp->next;
}
printf("\n ZStack end\n");
return OK;
}
验证输入为:

栈的应用
再开发中,函数的调用就是栈应用的例子。
另外,在ios开发中,导航栏也是栈应用的例子。