将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。
#include<iostream>
using namespace std;
typedef struct {
int top[2], bot[2];
int *V;
int m;
}DblStack;
void ShowMenu() {
cout << "************下面我们开始设计双栈************" << endl;
cout << "****************0.双栈初始化****************" << endl;
cout << "****************1.插入数据******************" << endl;
cout << "****************2.删除数据******************" << endl;
cout << "****************3.打印数据******************" << endl;
cout << "****************本实验仅进行一次************" << endl;
}
//初始化一个大小为m的双向栈
void InitDblStack(DblStack &S) {
cout << "请输入双栈的大小" << endl;
cin >> S.m;
//动态分配一个最大容量为m的数组空间
S.V = new int[S.m];
//左栈栈底指针
S.bot[0] = -1;
//右栈栈底指针
S.bot[1] = S.m;
//左栈栈顶指针
S.top[0] = -1;
//右栈栈顶指针
S.top[1] = S.m;
system("pause");
system("cls");
}
//向指定的i号栈中插入元素
void DblPush(DblStack &S) {
int i = 0;
int j = 0;
int flag=0;
int *x = new int();
cout << "请输入您要插入数据的栈号" << endl;
cin >> i;
//判断栈号是否输入错误
if (i < 0 || i>1)
cout << "栈号输入错误" << endl;
//向0栈插入数据,反之向1栈插入数据
if (i == 0) {
cout << "您要在此栈插入数据的个数" << endl;
cin >> j;
for (int t = 0;t < j;t++) {
cout << "插入第" << (t + 1) << "个数" << endl;
cin >> *x;
//判断栈是否已满
if (S.top[0] + 1 == S.top[1]) {
cout << "双栈已满,无法再继续添加数据" << endl;
flag=1;
}
else
S.V[++S.top[0]] = *x;
if(flag==1)
break;
}
}
else {
cout << "您要在此栈插入数据的个数" << endl;
cin >> j;
for (int t = 0;t < j;t++) {
cout << "插入第" << (t + 1) << "个数" << endl;
cin >> *x;
if (S.top[0] + 1 == S.top[1]){
cout <<"双栈已满,无法插入该数据" << endl;
flag=1;
}
else
S.V[--S.top[1]] = *x;
if(flag==1)
break;
}
}
delete x;
system("pause");
system("cls");
}
//删除指定的i号栈的栈顶元素,用x返回其值
void DblPop(DblStack &S){
int i,j;
cout << "您需要删除哪号栈的栈顶元" << endl;
cin >> i;
cout << "您需要删除几个数" << endl;
cin >> j;
for (int t = 0;t < j;t++) {
if (S.top[i] == S.bot[i])
{
cout << "该栈已为空栈" << endl;
break;
}
if (i == 0)
S.V[S.top[0]--];
else
S.V[S.top[1]++];
}
system("pause");
system("cls");
}
void PrintDblStack(DblStack &S) {
if (S.top[0] == S.bot[0])
cout << "第0栈为空栈。无法打印" << endl;
else {
cout << "第0栈的数据" << endl;
for (int i = 0; i < S.top[0] - S.bot[0];i++)
{
cout << S.V[i];
cout << " \t";
}
cout << endl;
}
if (S.top[1] == S.bot[1])
cout << "第1栈为空栈。无法打印" << endl;
else {
cout << "第1栈的数据" << endl;
for (int i = S.m;i > S.top[1];i--)
{
cout << S.V[i - 1];
cout << "\t";
}
cout << endl;
}
//本实验打印后就退出
system("pause");
exit(0);
}
int main() {
DblStack S;
int i;
while (1) {
ShowMenu();
cout << "请选择你的操作" << endl;
cin >> i;
switch(i)
{
case 0:{
//初始化双向栈
InitDblStack(S);
break;
}
case 1:{
//给栈添加数据
DblPush(S);
break;
}
case 2:{
//删除栈中数据
DblPop(S);
break;
}
case 3:{
//打印数据
PrintDblStack(S);
break;
}
default:
break;
}
}
}
}
本代码仅是为了完成数据结构的作业,所以还不完善,见谅。
。。。。。。。。
其实是敲不动了
。。。。。。。。