西安交通大学915-2017-编程3

该博客详细介绍了如何设计并实现两个栈共享同一存储区域的算法,栈顶采用相向增长的方式以减少溢出可能性。代码示例中展示了左栈和右栈的进栈、出栈操作,以及检查栈是否满、空的函数。通过实例演示了两个栈分别从两端压入数组元素,并依次弹出,验证了算法的正确性。
摘要由CSDN通过智能技术生成

题目描述:

设有两个栈s1, s2都采用顺序存储方式,并且共享一个存储区域[0, … , maxsize - 1],为了尽量使用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式,请设计s1, s2的出栈,进栈操作算法。
要求:采用空间策略;算法数据结构;写出算法步骤

解题思路:

  • 分为左栈和右栈,左栈栈顶指针初始为-1,右栈栈顶指针初始为maxsize
  • 共享栈满的条件:top1 + 1 == top2
  • 左栈空的条件:top1 == -1
  • 右栈空的条件:top2 == maxsize
代码实现:
#include <iostream>
#include <cstring>
using namespace std;

const int MAXSIZE = 100;

class SharedStack {
private:
    int leftTop;
    int rightTop;
    int st[MAXSIZE];
public:
    SharedStack() {
        this->leftTop = -1;
        this->rightTop = MAXSIZE;
        memset(st, 0, sizeof(st));
    }

    bool IsFull() {
        return (this->leftTop + 1) == this->rightTop;
    }

    bool IsLeftEmpty() {
        return this->leftTop == -1;
    }

    bool IsRightEmpty() {
        return this->rightTop == MAXSIZE;
    }


    int GetLeftTop() {
        if (!IsLeftEmpty()) {
            return st[this->leftTop];
        }
        return -1;
    }

    int GetRightTop() {
        if (!IsRightEmpty()) {
            return st[this->rightTop];
        }
        return -1;
    }

    void PushLeft(int x) {
        if (IsFull()) {
            cout << "the shared stack is full!" << endl;
            return;
        }
        st[++this->leftTop] = x;
    }

    void PushRight(int x) {
        if (IsFull()) {
            cout << "the shared stack is full!" << endl;
            return;
        }
        st[--this->rightTop] = x;
    }

    void PopLeft() {
        if (IsLeftEmpty()) {
            cout << "empty! can not pop" << endl;
            return;
        }
        --this->leftTop;
    }

    void PopRight() {
        if (IsRightEmpty()) {
            cout << "empty! can not pop" << endl;
            return;
        }
        ++this->rightTop;
    }
};


int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(int);
    SharedStack sta;
    for (int i = 0; i < n; i++) {
        sta.PushLeft(arr[i]);
    }
    while (!sta.IsLeftEmpty()) {
        cout << sta.GetLeftTop() << " ";
        sta.PopLeft();
    }
    cout << endl;

    SharedStack stb;
    for (int i = 0; i < n; i++) {
        stb.PushRight(arr[i]);
    }
    while (!stb.IsRightEmpty()) {
        cout << stb.GetRightTop() << " ";
        stb.PopRight();
    }
    cout << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值