概念
1.栈的定义
栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或删除操作的端称为栈顶(Top).栈项由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是记录栈顶元素所在数组位置标号的一个整型变量:对于链式栈,就是记录栈项元素所在结点地址的指针)来指示,它是动态变化的。表的另端称为栈底, 栈底是固定不变的。栈的插入和删除操作一般称为入栈和出栈。
2.栈的特点
由栈的定义可以看出,栈的主要特点就是先进后出(FILO). 栈中的元素就好比开进一个死胡同的车队,最先开进去的汽车只能等后进来的汽车都出去了,才能出来。
3.顺序栈的要素
对于顺序栈s。-共有4个要素,包括两个特殊状态和两个操作。
(1)几个状态
1)栈空状态。
stop--I.有的书上规定==0 为栈空条件,这样会浪费一个元素大小的空间,本书统一规定栈空状态为stop--1.
2)栈满状态。
==maxSize-1。maxSize为栈中最大元素的个数,则maxSize-1为栈满时栈项元素在数组中的位置,因为数组下标从0号开始。本书规定栈顶指针top为-1时栈空,即top==0的数组位置也可以存有数据元素。
3)非法状态(上溢和下溢)。
栈满就是一种继续入栈就会上溢的状态,对应的栈下溢就是栈空的时候继续出栈所造成的结果。
(2)两个操作
1)元素x进找操作: ++();st.data[]=x;。既然规定了top为-1时栈为空,则元素进栈操作必须是先移动指针,再进入元素,因为数组下标不存在-1。
2)元素x出栈操作: x=st.data[]; --();. 进栈操作次序决定了出栈操作次序,由于进栈操作是先变动栈顶指针,再存入元素,因此出栈操作必须为先取出元素,再变动指针。如果在上述进栈操作不变的情况下先变动指针,再取出元素,则栈顶元素丢失,取出的是栈顶下边的元素。
代码
#include <stdio.h>
#define maxSize 20
typedef struct {
int data[maxSize];// 存放栈中元素,maxSize是已经定义好的常量
int top;// 栈顶指针
} SqStack; // 顺序栈类型定义
/* 初始化顺序栈 */
/* &st指的是要操作的顺序栈 */
void initStack(SqStack &st) {
=-1; // 只需将栈顶指针设置为-1,本栈中将top=-1规定为栈空状态
}
/* 判断栈空 */
/* st指的是要进行判空的顺序栈 */
int isEmpty(SqStack st) {
// 栈为空的时候返回1,否则返回0
if(==-1) { // 判空的条件是栈顶指针是否等于-1
return 1;
} else {
return 0;
}
}
/* 判断栈满 */
/* st指的是要进行判满的顺序栈 */
int isFull(SqStack st) {
// 如果栈顶指针等于maxSize-1那么栈满,否则栈空
if(==maxSize-1) { // maxSize是栈中最大元素个数,已经定义
return 1;// 栈满返回1
} else {
return 0;// 栈空返回0
}
}
/* 进栈 */
/* &st指的是要操作的栈;x指的是要进栈的数据 */
int push(SqStack &st,int x) {
/* 进栈首先要判断栈是否栈满,如果满栈则不能进栈 */
if(isFull(st)==1) {
return 0;// 如果栈满返回0,表示不能进栈
} else {
// 注意:++top和top++在这里的作用是一样的,都可以使用,如果是a=++top和a=top++,那么两个a的值是不一样的,最后top的值还是一样
++;// 先移动指针,再进栈
st.data[]=x;
return 1;// 进栈成功返回1
}
}
/* 出栈 */
/* &st指的是要操作的栈;&x指的是要出栈的数据 */
int pop(SqStack &st,int &x) {
/* 出栈之前要判断栈是否为空 */
if(isEmpty(st)==1) {// 1表示栈空,0表示非空
return 0;// 如果栈空,不能出栈,返回0
} else {
x=st.data[];// 先取出元素,再出栈
--;
return 1;// 出栈成功返回1
}
}
/* 打印栈,从左到右表示栈底到栈顶 */
/* stack表示要被打印的栈 */
void printStack(SqStack stack) {
printf("\n");
for(int i=0; i<=; i++) {// 注意:data[0]表示栈底元素,data[top]表示栈顶元素
printf("%d\t",stack.data[i]);// 打印栈中元素
}
printf("\n");
}
int main() {
SqStack stack;
int x;
/* 初始化栈 */
initStack(stack);
/* 判断是否栈满 */
printf("是否栈满(1表示满,0表示非满):%d",isFull(stack));
/* 入栈 */
push(stack,1);// 将1加入栈
push(stack,2);// 将2加入栈
push(stack,3);// 将3加入栈
push(stack,4);// 将4加入栈
push(stack,5);// 将5加入栈
printStack(stack);// 打印入栈完毕的栈
/* 判断是否栈空 */
printf("是否栈空(1表示空,0表示非空):%d\n\n",isEmpty(stack));
/* 出栈 */
/* 第一次出栈 */
pop(stack,x);// 将栈顶元素出栈
printf("出栈元素:%d",x); // 打印出栈的元素
printStack(stack);// 打印剩下的栈中元素
/* 第二次出栈 */
pop(stack,x);
printf("出栈元素:%d",x);
printStack(stack);
/* 第三次出栈 */
pop(stack,x);
printf("出栈元素:%d",x);
printStack(stack);
return 0;
}
结果如下: