概述
栈特点
- 本质是操作受限的线性表,只能在一端进行插入删除操作
- 后进先出(LIFO)
用途
- 模拟递归
- 深度优先遍历,实现DFS
- 中缀表达式求值
- 求任意两个成员的关系(如括号匹配问题,先用栈预处理)
## 设计数据结构
typedef struct Stack {
TYPENAME *_pdata; //栈内元素
int _capaticy; //栈的上限
int _top; //栈顶,末尾元素的下标
}Stack_t, *pStack_t;
单向链表的相关操作
- 初始化
- 判空
- 销毁(销毁堆空间)
- 压栈
- 弹栈
- 查看栈顶
操作实现步骤
初始化(参数:栈地址,栈大小)
- 按照大小申请堆空间
- top = -1;
判空(参数:栈地址)
- return top == -1;
判满(参数:栈地址)
- return top == capaciy;
销毁(参数:栈地址)
- 如果堆空间存在,就释放
压栈(参数:栈地址,新元素)
-
如果栈满,报错返回
-
如果栈未满,插入栈顶后的位置
弹栈(参数:栈地址)
- 如果栈空,报错返回
- 如果栈非空,栈顶减一
查看栈顶(参数:栈地址)
- 如果栈空,报错返回
- 如果栈非空,返回栈顶元素
代码
头文件 SeqStack.h
#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__
#define TYPENAME int
typedef struct Stack {
TYPENAME *_pdata; //栈内元素
int _capaticy; //栈的上限
int _top; //栈顶,末尾元素的下标
}Stack_t, *pStack_t;
void stack_init(pStack_t pSt, int size);
void stack_destroy(pStack_t pSt);
int stack_empty(pStack_t pSt);
int stack_full(pStack_t pSt);
int stack_push(pStack_t pSt, TYPENAME val);
int stack_pop(pStack_t pSt);
//使用前需判断有无元素
TYPENAME stack_top(pStack_t pSt);
#endif
实现文件 SeqStack.c
#include "SeqStack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void stack_init(pStack_t pSt, int size)
{
pSt->_pdata = (TYPENAME*)calloc(size, sizeof(TYPENAME));
pSt->_capaticy = size;
pSt->_top = -1;
}
void stack_destroy(pStack_t pSt)
{
if (!stack_empty(pSt)) {
free(pSt->_pdata);
pSt->_pdata = NULL;
memset(pSt, 0, sizeof(Stack_t));
}
}
int stack_empty(pStack_t pSt)
{
return -1 == pSt->_top;
}
int stack_full(pStack_t pSt)
{
return pSt->_top + 1 == pSt->_capaticy;
}
int stack_push(pStack_t pSt, TYPENAME val)
{
if (!stack_full(pSt)) {
pSt->_pdata[++pSt->_top] = val;
return 0;
}
printf("Stack is full, cannot push!\n");
return -1;
}
int stack_pop(pStack_t pSt)
{
if (!stack_empty(pSt)) {
--pSt->_top;
return 0;
}
printf("Stack is empty, cannot pop!\n");
return -1;
}
//使用前需判断有无元素
TYPENAME stack_top(pStack_t pSt)
{
return pSt->_pdata[pSt->_top];
}
测试文件 test_seqstack.c
#include "SeqStack.h"
#include <stdio.h>
void test0()
{
Stack_t st;
stack_init(&st, 6);
stack_top(&st);
printf("\n-----------test stack_push------------\n");
stack_push(&st, 4);
stack_push(&st, 5);
stack_push(&st, 3);
stack_push(&st, 9);
stack_push(&st, 4);
stack_push(&st, 5);
stack_push(&st, 3);
stack_push(&st, 9);
if (!stack_empty(&st)) {
printf("st.top = %d\n", stack_top(&st));
}
printf("st.size = %d, st.capacity = %d\n", st._top + 1, st._capaticy);
printf("\n-----------test stack_push------------\n");
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
stack_pop(&st);
if (!stack_empty(&st)) {
printf("st.top = %d\n", stack_top(&st));
}
printf("st.size = %d, st.capacity = %d\n", st._top + 1, st._capaticy);
/* stack_destroy(&st); */
}
int main()
{
test0();
return 0;
}