栈练习之Example004-顺序栈 s0 和 s1 共享一个存储区 elem,设计共享栈关于入栈和出栈操作的算法

Example004

题目

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

分析

关于共享栈详情请参考:共享栈

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

但没有 共享栈 详细。

图解

略。

C实现

详细代码请参考:

Java实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如下: ```c++ #define maxsize 100 //假设的最大长度为100 typedef struct { int data[maxsize]; //存储的数组 int top1; //1的顶 int top2; //2的顶 } ShareStack; //初始化两个顶指针 void InitStack(ShareStack &S) { S.top1 = -1; S.top2 = maxsize; } //判断1是否为空 bool Stack1Empty(ShareStack S) { if(S.top1 == -1) { return true; } else { return false; } } //判断2是否为空 bool Stack2Empty(ShareStack S) { if(S.top2 == maxsize) { return true; } else { return false; } } //入栈操作 bool Push(ShareStack &S, int elem, int stackNumber) { if(S.top1 + 1 == S.top2) { //满,不能入栈 return false; } if(stackNumber == 1) { //对1进行入栈操作 S.top1++; //1的顶指针加1 S.data[S.top1] = elem; //将元素elem入栈1 } else if(stackNumber == 2) { //对2进行入栈操作 S.top2--; //2的顶指针减1 S.data[S.top2] = elem; //将元素elem入栈2 } return true; } //出栈操作 bool Pop(ShareStack &S, int &elem, int stackNumber) { if(stackNumber == 1) { //从1中出栈 if(Stack1Empty(S)) { return false; //空,无法出栈 } elem = S.data[S.top1]; //取出栈1的顶元素 S.top1--; //1的顶指针减1 } else if(stackNumber == 2) { //从2中出栈 if(Stack2Empty(S)) { return false; //空,无法出栈 } elem = S.data[S.top2]; //取出栈2的顶元素 S.top2++; //2的顶指针加1 } return true; } ``` 希望能解答您的问题! ### 回答2: 设定两个s1和s2的顶指针top1和top2,初始值分别为-1和maxsize。 入栈操作: - 对于s1,如果top1+1小于top2,则元素可以入栈,将元素放在top1+1的位置,并将top1加1。 - 对于s2,如果top2-1大于top1,则元素可以入栈,将元素放在top2-1的位置,并将top2减1。 出栈操作: - 对于s1,如果top1大于等于0,则可以执行出栈操作,将顶元素返回,并将top1减1。 - 对于s2,如果top2小于maxsize,则可以执行出栈操作,将顶元素返回,并将top2加1。 判断操作: - 对于s1,如果top1等于-1,则s1为空。 - 对于s2,如果top2等于maxsize,则s2为空。 判断操作: - 如果top1+1等于top2,则已满。 通过以上操作,可以实现两个顺序存储,并尽量利用空间,减少溢出的可能。 ### 回答3: 首先,需要定义两个的结构体: ```C #define MAXSIZE 300 typedef struct{ int data[MAXSIZE]; int top1; int top2; }SharedStack; ``` 其中,data数组用于存储的元素,top1和top2分别表示1和2的顶元素位置。接下来定义初始化函数initSharedStack(),这个函数将1和2的顶位置分别初始化为0: ```C void initSharedStack(SharedStack *stack){ stack->top1 = 0; stack->top2 = MAXSIZE - 1; } ``` 两个共享一个存储,因此需要定义推入元素的操作push()。当往1中推入元素时,1的顶位置top1递增;当往2中推入元素时,2的顶位置top2递减: ```C void push(SharedStack *stack, int stackNum, int element){ if(stackNum == 1){ if(stack->top1 < stack->top2){ stack->data[stack->top1++] = element; }else{ printf("1已满,无法推入元素\n"); } }else if(stackNum == 2){ if(stack->top2 > stack->top1){ stack->data[stack->top2--] = element; }else{ printf("2已满,无法推入元素\n"); } }else{ printf("的编号无效\n"); } } ``` 最后,定义一个弹出元素的操作pop()。当从1弹出元素时,1的顶位置top1递减,并返回顶元素;当从2弹出元素时,2的顶位置top2递增,并返回顶元素: ```C int pop(SharedStack *stack, int stackNum){ int element; if(stackNum == 1){ if(stack->top1 > 0){ element = stack->data[--stack->top1]; }else{ printf("1为空,无法弹出元素\n"); } }else if(stackNum == 2){ if(stack->top2 < MAXSIZE - 1){ element = stack->data[++stack->top2]; }else{ printf("2为空,无法弹出元素\n"); } }else{ printf("的编号无效\n"); } return element; } ``` 这样,我们就可以使用这两个了。使用方法如下: ```C int main(){ SharedStack stack; initSharedStack(&stack); push(&stack, 1, 1); // 向1推入元素1 push(&stack, 2, 2); // 向2推入元素2 int element1 = pop(&stack, 1); // 从1弹出元素并存储element1中 int element2 = pop(&stack, 2); // 从2弹出元素并存储element2中 printf("element1 = %d, element2 = %d\n", element1, element2); return 0; } ``` 这样就实现了利用空间的最大化和减少溢出可能性的结构。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值