一、栈的基本概念
1、栈的定义
栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或者删除操作的一端叫做栈顶,另一端叫做栈底。栈的插入和删除操作称为入栈和出栈。
2、栈的特点
从栈的定义可以看出,栈只允许在栈顶进行插入删除操作,这就决定了栈**先进后出(FILO)**的特点。并且,当有n个元素以某种顺序进栈,并且可以任意出栈,其所获得元素排列的数目S满足
3、栈的存储结构
栈可以根据存储结构分为两种:顺序栈和链式栈。
二、顺序栈和链式栈的操作
1、顺序栈
//结构体的定义
typedef struct{
int data[maxSize]; //存放栈中元素,maxSize是已定义常量
int top; //栈顶指针
}SqStack;顺序栈类型定义
//初始化
void initStack(SqStack &st){
st.top = -1;//只需要将栈顶指针置于-1,这样第一个元素就是从0下标开始
}
//判断是否为空栈
int isEmpty(SqStack st){
if(st.top == -1){
return 1;//空
}else{
return 0;
}
}
//进栈
int push(SqStack &st,int x){
if(st.top == maxSize -1){//判断是否满栈
return 0;
}
++(st.top);//移动指针,再进栈
st.data[st.top] = x;
return 1;
}
//出栈
int pop(Sqstack &st,int &x){
if(st.top == -1){//栈空则不出栈
return 0;
}
x = st.data[st.top];//取出元素,再移动指针
--(st.top);
return 1;
}
2、链式栈
我感觉和顺序栈差不多,你只要把顺序表和链式表搞清楚,这里就很简单,可以移步我的另一篇讲线性表的废话文
//结构体定义
typedef struct LNode{
int data; //数据域
struct LNode *next;//指针域
}LNode;
//初始化
void initStack(LNode *&st){
lst = (LNode*)malloc(sizeof(LNode));//制造一个头结点
lst ->next = NULL;
}
//判断栈空只需要判断lst ->next == NULL就可以了
//进栈
void push(LNode *lst, int x){
LNode *p;
p = (LNode*)malloc(sizeof(LNode));//制造一个头结点
p ->next = NULL;
//链表头插法
p->data = x;
p->next=lst->next;
lst->next = p;
}
//出栈
int pop(LNode *lst, int &x){
LNode *p;
if(lst->next == NULL){//空栈则无法出栈
return 0;
}
//链表的删除
p = lst->next;
x = p->data;
lst ->next = p->next;
free(p);
return 1;
}
三、栈的应用
栈的应用实在是太多了,什么匹配啦,乱七八糟的都可以用栈来解决,感觉出题最多的是符号匹配,至于代码,自己百度吧。