考研数据结构之栈(2.5)——练习题之设计一个共享栈s0和s1以及有关入栈和出栈操作的算法(C表示)

题目

为了充分利用空间,顺序栈s0、s1共享一个存储区elem[0, ... , maxSize-1]。试着设计一个共享栈s0、s1以及有关入栈和出栈操作的算法,假设栈中元素是int型。

分析

算法思想:

1)顺序栈栈底固定不变,因此将栈底设在存储区的两端,即s0栈底设在0处,sI栈底设在maxSize-1处,栈顶在0~maxSize-1的范围内变动。当两栈栈顶相遇时为栈满,这样可以尽可能地利用空间。
2) sO的栈项为top0,s0 入栈操作为: top0 先自增1,然后存入元素:出栈操作为:先取出栈项元素,top0再自减1. sI的栈顶为top1, s1入栈操作为: top1 先自减1,然后存入元素:出栈操作为:先取出栈顶元素,topl 再自增1.

图解:

代码

#include<stdio.h>
#include<stdlib.h>

#define maxSize 20

/* 定义共享栈结构体 */
typedef struct {
	int elem[maxSize];// 栈空间
	int top[2];// top[0]为s0栈顶,top[1]为s1栈顶
} SqStack;

/* 初始化栈 */
void initStack(SqStack &st) {
	st.top[0]=-1;// st0栈的栈底是-1
	st.top[1]=maxSize;// st1栈的栈底是maxSize
}

/* 入栈 */
/* &st指的是共享栈;stNo指的是栈的编号,指元素入哪个栈;x指的是要入栈的元素 */
int push(SqStack &st,int stNo,int x) {
	if(st.top[0]+1<st.top[1]) { // 栈不满,则元素可以入栈
		if(stNo==0) { // 元素入st0
			++(st.top[0]);// 栈顶指针先加1
			st.elem[st.top[0]]=x;// 将新的元素压入st0栈中
			return 1;// 入栈成功返回1
		} else if(stNo==1) { // 元素入st1
			--(st.top[1]);// 由于st1栈的栈顶元是从数组尾部开始向前的,所以需要减1
			st.elem[st.top[1]]=x;// 将元素压入st1栈中
			return 1;// 入st1栈成功返回1
		} else {
			return -1;// 输入栈编号有误,返回-1
		}
	} else {
		return 0;// 栈满后元素不能入栈,返回0
	}
}

/* 出栈 */
/* &st指的是共享栈;stNo指的是栈的编号,指元素要出哪个栈;&x接收要栈的栈顶元素 */
int pop(SqStack &st,int stNo,int &x) {
	if(stNo==0) { // 表示st0栈的元素出栈
		if(st.top[0]!=-1) { // st0不空,则可以出栈
			x=st.elem[st.top[0]];// 出栈st0的栈顶元素
			--(st.top[0]);// 栈顶指针减1
			return 1;// 出栈成功返回1
		} else {
			return 0;// 栈空,出栈失败返回0
		}
	} else if(stNo==1) { // 表示st1栈的元素出栈
		if(st.top[1]!=maxSize) { // 栈不空,可以出栈
			x=st.elem[st.top[1]];// 出栈st1的栈顶元素
			++(st.top[1]);// 由于st1栈是从数组尾部开始的,所以需要加1才能表示出栈
			return 1;// 出栈成功返回1
		} else {
			return 0;// 出栈失败返回0
		}
	} else {
		return -1;// 栈编号输入有误,返回-1
	}
}

/* 打印共享栈 */
void printStack(SqStack st) {
	printf("\n");
	for(int i=0; i<=st.top[0]; i++) {
		printf("%d\t",st.elem[i]);
	}
	for(int i=st.top[1]; i<maxSize; i++) {
		printf("%d\t",st.elem[i]);
	}
	printf("\n");
}

int main() {
	SqStack st;// 定义共享栈
	initStack(st);// 初始化栈

	push(st,0,1);// 将元素1压入st0栈
	push(st,0,2);// 将元素2压入st0栈
	push(st,1,6);// 将元素6压入st1栈
	push(st,1,5);// 将元素5压入st1栈
	push(st,1,4);// 将元素4压入st1栈
	printStack(st);

	int x1;
	pop(st,0,x1);// 将st0栈中的栈顶元素出栈
	printStack(st);// 打印当前栈
	int x2;
	pop(st,1,x2);// 将st1栈中的栈顶元素出栈
	printStack(st);

	return 0;
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值