计算机软件基础实验—实现共享堆栈
堆栈是一种常见的数据类型(先进后出)
想象一下我们有一个开着口的盒子,当我们往盒子里装东西时我们通常最后放的东西最容易拿出,这是堆栈的基本原理。共享堆栈就是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