共享栈的基本操作-C语言

共享栈的基本操作

共享栈是用顺序表实现, 在两端分别设置为栈底, 并且分别初始化栈顶, 实现可以在两端进行入栈和出栈操作, 并且互不干扰, 模拟分工成两个栈, 当两个栈顶索引重合时, 这代表该共享栈已满.

具体实现

定义一个共享栈

//定义一个共享栈
typedef struct {
	int stack[100];
	int top[2];
}SqStack;

初始化

//对共享栈进行初始化
void InitStack(SqStack* S) {
	S->top[0] = 0;
	S->top[1] = 99;
}

压栈操作


    //压栈操作
void Push(SqStack* S, int e, int flag) {
	//判断栈是否为满
	if (S->top[0] == S->top[1]) {
		printf("栈满\n");
		return;
	}
	if (flag == 0) {
		S->stack[S->top[0]] = e;
		++S->top[0];
		return;
	} else if (flag == 1) {
		S->stack[S->top[1]] = e;
		--S->top[1];
		return;
	} else {
		printf("输入有误\n");
		return;
	}
}


出栈操作

//出栈操作
int Pop(SqStack* S, int flag) {
	//判断栈是否为空
	if ((flag == 0 && S->top[flag] == 0)
		|| (flag == 1 && S->top[flag] == 99)) {
		printf("栈为空\n");
		return 0;
	}
	if (flag == 0) {
		--S->top[flag];
		return S->stack[S->top[flag]];
	} else if (flag == 1) {
		++S->top[flag];
		return S->stack[S->top[flag]];
	} else {
		printf("输入有误\n");
		return 0;
	}
}

测试

#include <stdio.h>
#include <windows.h>
//定义一个共享栈
typedef struct {
	int stack[100];
	int top[2];
}SqStack;
//对共享栈进行初始化
void InitStack(SqStack* S) {
	S->top[0] = 0;
	S->top[1] = 99;
}
//压栈操作
void Push(SqStack* S, int e, int flag) {
	//判断栈是否为满
	if (S->top[0] == S->top[1]) {
		printf("栈满\n");
		return;
	}
	if (flag == 0) {
		S->stack[S->top[0]] = e;
		++S->top[0];
		return;
	} else if (flag == 1) {
		S->stack[S->top[1]] = e;
		--S->top[1];
		return;
	} else {
		printf("输入有误\n");
		return;
	}
}
//出栈操作
int Pop(SqStack* S, int flag) {
	//判断栈是否为空
	if ((flag == 0 && S->top[flag] == 0)
		|| (flag == 1 && S->top[flag] == 99)) {
		printf("栈为空\n");
		return 0;
	}
	if (flag == 0) {
		--S->top[flag];
		return S->stack[S->top[flag]];
	} else if (flag == 1) {
		++S->top[flag];
		return S->stack[S->top[flag]];
	} else {
		printf("输入有误\n");
		return 0;
	}
}
int main() {
	SqStack s1;
	InitStack(&s1);
	for (int i = 0; i < 3; ++i) {
		Push(&s1, i + 1, 0);
		Push(&s1, 10 - i, 1);
	}
	for (int i = 0; i < 3; ++i) {
		printf("%d ", Pop(&s1, 0));
	}
	printf("\n");
	for (int i = 0; i < 3; ++i) {
		printf("%d ", Pop(&s1, 1));
	}
	printf("\n");
	system("pause");
	return 0;
}

效果图
在这里插入图片描述

希望该文章对大家有所帮助
同时真诚接受大家宝贵的评论的建议

共享是两个公用一个数组的结构,可以在顶相遇后继续向下扩展。 以下是共享基本操作的实现: 1. 初始化共享 ```c #define MAXSIZE 100 // 共享的最大长度 typedef struct { int data[MAXSIZE]; int top1; // 1的顶指针 int top2; // 2的顶指针 } SharedStack; // 初始化共享 void initSharedStack(SharedStack *s) { s->top1 = -1; s->top2 = MAXSIZE; } ``` 2. 共享是否为空 ```c // 判断共享是否为空 int isEmpty(SharedStack *s, int stackNum) { if (stackNum == 1) { return s->top1 == -1; } else { return s->top2 == MAXSIZE; } } ``` 3. 共享是否已满 ```c // 判断共享是否已满 int isFull(SharedStack *s) { return s->top1 + 1 == s->top2; } ``` 4. 共享操作 ```c // 共享操作 int push(SharedStack *s, int stackNum, int x) { if (isFull(s)) { return 0; // 已满,无法 } if (stackNum == 1) { s->data[++s->top1] = x; } else { s->data[--s->top2] = x; } return 1; // 成功 } ``` 5. 共享出栈操作 ```c // 共享出栈操作 int pop(SharedStack *s, int stackNum, int *x) { if (isEmpty(s, stackNum)) { return 0; // 为空,无法出栈 } if (stackNum == 1) { *x = s->data[s->top1--]; } else { *x = s->data[s->top2++]; } return 1; // 出栈成功 } ``` 6. 共享的打印操作 ```c // 共享的打印操作 void print(SharedStack *s, int stackNum) { if (isEmpty(s, stackNum)) { printf("The stack is empty.\n"); return; } if (stackNum == 1) { printf("Stack 1: "); for (int i = s->top1; i >= 0; i--) { printf("%d ", s->data[i]); } printf("\n"); } else { printf("Stack 2: "); for (int i = s->top2; i < MAXSIZE; i++) { printf("%d ", s->data[i]); } printf("\n"); } } ``` 注意:在使用共享进行出栈操作时,需要指定是操作哪个(1或2)。同时,在使用共享进行打印操作时,需要指定是打印哪个(1或2)。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值