03顺序栈的建立及基本操作

顺序栈的建立及基本操作


栈的定义

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

栈的特点

栈的主要特点就是先进后出(FILO)。如同一个开进死胡同的车队,最先进去的最后才能出来。

 栈的存储结构

线性表的存储结构分为顺序表和链表,栈也有相同的存储结构 :顺序栈跟链栈。本博客主要介绍顺序栈。

栈的数学性质

当n个元素以某种顺序依次进栈,并且可以在任意时刻出栈(在满足先进后出的前提下)时,所获得的元素排列数目N恰好满足函数Catalan()的计算,即:C(2n,n)/(n+1)。


顺序栈

在考研的过程中对于顺序栈有做要求,主要是对它的四个要素进行考察,这四个要素包括两个特殊状态和两个操作。

几个要素

1.栈空状态:st.top == -1。有的将栈空状态规定为st.top == 0,没有实质上的影响,具体看题目要求。

2.栈满状态:st.top == maxSize -1。其中maxSize表示栈中最大元素个数,则maxSize-1为栈满时栈顶元素在数组中的位置,因为数组下标从0开始。注:我们是将top为-1时为栈空,即top == 0的数组位置是有元素的。

3.非法状态:栈满时继续入栈会上溢,栈空时继续出栈会下溢。

两个操作:

1.入栈:因为我们设置top在-1位置,所以我们应该先移动指针再写入元素++(st.top);st.data[st.top] = inNum;

2.出栈:出栈应该先取出元素,再移动指针outNum = st.data[st.top];--st.top;

以下就是对于顺序栈的具体操作: 

 

首先我们对顺序栈进行定义

//顺序栈定义
typedef struct
{
    datatype data[maxsize];
    int top;
}SqStack,*SqueStack;

然后是对其进行初始化操作

void initStack(SqStack &st)
{
	st.top = -1;
}

 接着就是入栈操作

int Push_SqStack(SqStack &st)
{
	int inNum;
	printf("请输入你需要写入的元素(输入0的时候输入结束):\n");
	do
	{
		scanf("%d", &inNum);
		++(st.top);
		st.data[st.top] = inNum;
	} while (inNum!=0);
	printf("顺序栈建立成功!\n");
	return OK;
}

 出栈

int Pop_SqStack(SqStack st)
{
	int outNum;
	do
	{
		if (st.top <= -1)
		{
			printf("出栈完全!");
			return NULL;
		}
		else
		{
			outNum = st.data[st.top];
			printf("删除的栈顶元素是%d\n", outNum);
			--st.top;
		}
	} while (st.top>-1);
}

主函数 

int main()
{
	SqStack *S;
	S = (SqueStack)malloc(sizeof(SqStack));
	initStack(*S);
	Push_SqStack(*S);
	Pop_SqStack(*S);
	system("pause");
	return EXIT_SUCCESS;
}

代码也就全部展现在上面,没有什么难点,仔细分析还是可以理解的。下面是一些补充的内容:

//判断栈空
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;
}

我是CSDN实习三个半月的    "个人练习生"

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值