计算机软件基础实验---实现共享堆栈

计算机软件基础实验—实现共享堆栈

堆栈是一种常见的数据类型(先进后出)
想象一下我们有一个开着口的盒子,当我们往盒子里装东西时我们通常最后放的东西最容易拿出,这是堆栈的基本原理。共享堆栈就是4个面,两头美盖子的盒子,我们从两头往盒子里填入物品。

main.cpp

#include <QCoreApplication>
#include <iostream>
#include <duizhan.h>
#include <stdio.h>
/*说明:
 *作业题目一实现共享堆栈
 */


using namespace std;


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cout<<"请输入建立共享堆栈的大小"<<endl;
    int size_dingyi;
    cin >> size_dingyi;
    DuiZhan D1(size_dingyi);
    cout<<D1.Get_DuiZhan1Ptr()<<endl;
    cout<<D1.Get_DuiZhan2Ptr()<<endl;
    cout<<"请输入数据"<<endl;
    fflush(stdout);

    while(1){
        //输入指令
        int data;
        cin >> data;
        //判断奇偶
        if(data & 1){//奇数放左边
            D1.Input_DuiZhan1(data);
        }else{
            D1.Input_DuiZhan2(data);
        }
        D1.print_data();
        cout<<endl;

        fflush(stdout);
        char commend;
        cout<<"q = quit      a = popl     s = popr     w = continue"<<endl;
        cin >> commend;
        if(commend == 'q') break;
        else if(commend == 'a') cout<<"pop left"<<D1.POP_DuiZhan1()<<endl;
        else if(commend == 's') cout<<"pop right"<<D1.POP_DuiZhan2()<<endl;
        else if(commend == 'w') continue;
        cout<<endl;
        D1.print_data();
        fflush(stdout);
    }

    return a.exec();
}

duizhan.cpp

#include "duizhan.h"

DuiZhan::DuiZhan(int Size_of_DZ)
{
    size_of_duizhan = Size_of_DZ;
    //初始化
    duizhan1 = (int *)malloc(sizeof(int) * Size_of_DZ)-1;
    duizhanTOP = duizhan1;
    if (duizhan1 == NULL)
            exit(-1);//内存不足
    else
        duizhan2 = duizhan1 + Size_of_DZ+1;

    //初始化为0
    for(int i = 0; i < size_of_duizhan; i++){
         *(duizhanTOP+1+i) = 0;
    }
}


int* DuiZhan::Get_DuiZhan1Ptr(void){
    return  duizhan1;
}
int* DuiZhan::Get_DuiZhan2Ptr(void){
    return  duizhan2;
}

bool DuiZhan::Input_DuiZhan1(int data){
    //先判断是否符合
    if (duizhan1+1 == duizhan2){
        cout<<"full"<<endl;
        return false;
    }
    //指针加一
    duizhan1++;
    //存入数据
    *duizhan1 = data;
    //更新栈的大小
    size_of_used++;

    return true;
}
bool DuiZhan::Input_DuiZhan2(int data){
    //先判断是否符合
    if (duizhan1+1 == duizhan2){
        cout<<"full"<<endl;
        return false;
    }

    //指针加一
    duizhan2--;
    //存入数据
    *duizhan2 = data;
    //更新栈的大小
    size_of_used++;

    return true;
}
int DuiZhan::POP_DuiZhan1(void){
    //判判断堆栈是否到头
    if(duizhanTOP == duizhan1-1){
        judege_full = false;
        cout<<"null"<<endl;
        return 65535;
    }
    //出栈
    int redata =  *duizhan1;
    //指针
    duizhan1--;
    //更新栈的大小
    size_of_used--;

    return redata;
}
int DuiZhan::POP_DuiZhan2(void){
    //判判断堆栈是否到底
    if(duizhanTOP + size_of_duizhan + 1 == duizhan2){
        judege_full = false;
        cout<<"null"<<endl;
        return 65535;
    }
    //出栈
    int redata =  *duizhan1;
    //指针
    duizhan2++;
    //更新栈的大小
    size_of_used--;

    return redata;
}
void DuiZhan::print_data(void){

    for(int i = 0; i < size_of_duizhan; i++){
        cout << *(duizhanTOP+1+i) << "    ";
    }
    cout<<endl;
    fflush(stdout);
}

duizhan.h

#ifndef DUIZHAN_H
#define DUIZHAN_H
#include <stdio.h>
#include <iostream>

using namespace std;
class DuiZhan
{

public:
    DuiZhan(int Size_of_DZ);

    int* Get_DuiZhan1Ptr(void);
    int* Get_DuiZhan2Ptr(void);

    bool Input_DuiZhan1(int data);//入成功返回true
    bool Input_DuiZhan2(int data);//如失败返回false

    void print_data(void);


    bool Error_judge(void);
    int POP_DuiZhan1(void);
    int POP_DuiZhan2(void);

protected:
    bool judege_full = true;//定义堆栈正确
    int size_of_duizhan;//定义堆栈的大小
    int size_of_used = 0;//定义使用了堆栈的多少
    int* duizhanTOP;
    int* duizhan1;//堆栈1栈顶指针
    int* duizhan2;//堆栈2栈顶指针

};

#endif // DUIZHAN_H

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值