考研数据结构之栈(2.1)——顺序栈的操作(C表示)

概念

1.栈的定义

栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或删除操作的端称为栈顶(Top).栈项由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是记录栈顶元素所在数组位置标号的一个整型变量:对于链式栈,就是记录栈项元素所在结点地址的指针)来指示,它是动态变化的。表的另端称为栈底, 栈底是固定不变的。栈的插入和删除操作一般称为入栈和出栈。

2.栈的特点

由栈的定义可以看出,栈的主要特点就是先进后出(FILO). 栈中的元素就好比开进一个死胡同的车队,最先开进去的汽车只能等后进来的汽车都出去了,才能出来。

3.顺序栈的要素

对于顺序栈s。-共有4个要素,包括两个特殊状态和两个操作。

(1)几个状态

1)栈空状态。
stop--I.有的书上规定st.top==0 为栈空条件,这样会浪费一个元素大小的空间,本书统一规定栈空状态为stop--1.

2)栈满状态。
st.top==maxSize-1。maxSize为栈中最大元素的个数,则maxSize-1为栈满时栈项元素在数组中的位置,因为数组下标从0号开始。本书规定栈顶指针top为-1时栈空,即top==0的数组位置也可以存有数据元素。

3)非法状态(上溢和下溢)。

栈满就是一种继续入栈就会上溢的状态,对应的栈下溢就是栈空的时候继续出栈所造成的结果。

(2)两个操作

1)元素x进找操作: ++(st.top);st.data[st.top]=x;。既然规定了top为-1时栈为空,则元素进栈操作必须是先移动指针,再进入元素,因为数组下标不存在-1。
2)元素x出栈操作: x=st.data[st.top]; --(st.top);. 进栈操作次序决定了出栈操作次序,由于进栈操作是先变动栈顶指针,再存入元素,因此出栈操作必须为先取出元素,再变动指针。如果在上述进栈操作不变的情况下先变动指针,再取出元素,则栈顶元素丢失,取出的是栈顶下边的元素。

代码

#include <stdio.h>

#define maxSize 20

typedef struct {
	int data[maxSize];// 存放栈中元素,maxSize是已经定义好的常量
	int top;// 栈顶指针
} SqStack; // 顺序栈类型定义

/* 初始化顺序栈 */
/* &st指的是要操作的顺序栈 */
void initStack(SqStack &st) {
	st.top=-1; // 只需将栈顶指针设置为-1,本栈中将top=-1规定为栈空状态
}

/* 判断栈空 */
/* st指的是要进行判空的顺序栈 */
int isEmpty(SqStack st) {
	// 栈为空的时候返回1,否则返回0
	if(st.top==-1) { // 判空的条件是栈顶指针是否等于-1
		return 1;
	} else {
		return 0;
	}
}

/* 判断栈满 */
/* st指的是要进行判满的顺序栈 */
int isFull(SqStack st) {
	// 如果栈顶指针等于maxSize-1那么栈满,否则栈空
	if(st.top==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.top;// 先移动指针,再进栈
		st.data[st.top]=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[st.top];// 先取出元素,再出栈
		--st.top;
		return 1;// 出栈成功返回1
	}
}

/* 打印栈,从左到右表示栈底到栈顶 */
/* stack表示要被打印的栈 */
void printStack(SqStack stack) {
	printf("\n");
	for(int i=0; i<=stack.top; 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;
}

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值