宝剑锋从磨砺出,梅花香自苦寒来
一. 一些基本概念
(1)栈:首先提到栈最先想到的就是它是一种后进先出LIFO(先进后出FILO)的线性表,栈规定只能在线性表的尾部进行插入和删除元素操作。栈的尾部称作栈顶(top),相应的表头成为栈底(bottom)。数据入栈是从栈顶插入(push),同样出栈也是从栈顶取出(pop)。下面定义一个栈的顺序存储框架:
//定义顺序栈
typedef struct SEQSTACK{
void* data[Max];
int stacksize;
}SeqStack;
接着定义一个栈的链式存储框架:
//定义链表栈节点
typedef struct LINKNODE{
void* data;
struct LINKNODE* next;
}LinkNode;
//定义链表栈
typedef struct LINKSTACK{
LinkNode node;
int stacksize;
}LinkStack;
二. 代码实现
1. 栈的初始化
//初始化栈
SeqStack* Init_SeqStack(){
SeqStack* stack = (SeqStack*)malloc(sizeof(SeqStack));
for(int i = 0; i < Max; i++){
stack -> data[i] = NULL;
}
stack -> stacksize = 0;
return stack;
}
2. 入栈
//入栈
void Push_SeqStack(SeqStack* stack, void* data){
//如果数据为空返回
if (data == NULL){
return;
}
//如果栈满则追加空间
if (stack -> stacksize == Max){
SeqStack* stack = (SeqStack*)realloc(SeqStack* stack, (stack -> stacksize + INCREMENTSIZE) * sizeof(void*));
for(int i = 0; i < Max + INCREMENTSIZE; i++){
stack -> data[i] = NULL;
}
stack -> stacksize = stack -> (stacksize + INCREMENTSIZE);
}
stack -> data[stack -> stackszie] = data;
stack -> stacksize++;
}
3. 出栈
//出栈
void Pop_SeqStack(SeqStack* stack){
if (stack == NULL){
return NULL;
}
if (stack -> stacksize == 0){
return;
}
stack -> data[stack -> (stacksize - 1)] = NULL;
stack -> stacksize--;
}
4. 常用函数
#include <stack> //引入的头文件
stack<char> st;
st.empty() 堆栈为空则返回真
st.pop() 移除栈顶元素
st.push() 在栈顶增加元素
st.size() 返回栈中元素数目
st.top() 返回栈顶元素