栈和队的实现7--双栈(分偶数部分,和号奇数部分)

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个空间。

具体实现方法大概有两种:
一种是奇偶栈,就是所有下标为奇数的是一个栈,偶数是另一个栈。但是这样一个栈的最大存储就确定了,并没有起到互补空缺的作用,我们实现了也就没有太大意义。

还有一种就是,栈底分别设在数组的头和尾。进栈往中间进就可以了。这样,整个数组存满了才会真的栈满。
本博客双栈类型结构的规则:
把编号为0和1的2个栈存放于一个空间V[M]之间,栈底分别位于数组两端,当top[0]=-1时,该栈为空,当1号栈的栈顶指针top[1]=m时,栈为空。
2个栈从2端向中间增长。

#include"pch.h"
#include<iostream>
#define maxsize 100
using namespace std;

typedef int elemType;
//编程实现输入n(1<=n <=20)个整数,若是偶数入栈1,否则入栈2。然后栈1中元素依次出栈输出,栈2中的元素依次出栈输出。

typedef struct {
	int top[2], bot[2];//栈顶,栈第指针
	int m;				//栈最大容纳元素个数
	//elemType V[maxsize];		//栈数组
	elemType *V;
}DblStack;
//1.初始化
bool initDblStack(DblStack &S, int m) {
	S.V = new elemType[m];
	S.bot[0] = S.top[0] = -1;
	S.top[1] = S.bot[1] = m;
	S.m = m;
	return true;
}
//2.判断栈空
bool isEmpty(DblStack S, int i) {//i号栈
	return S.top[i] == S.bot[i];
}
//3.判断栈满
bool isFull(DblStack &S) {
	return (S.top[0] + 1) == S.top[1];
}
//4.进栈
bool DPush(DblStack &S, int i, int x) {//指定是i号栈
	//先判空
	if (S.top[1] - S.top[0] == 1) return false;
	if (i == 0)
		S.V[++S.top[0]] = x;
	else
		S.V[--S.top[1]] = x;
	return true;
}
//5.出栈
bool DPop(DblStack &S, int i, int x) {
	if (S.bot[i] == S.top[i]) {//初始化的状态
		return false;
	}
	else {
		if (i == 0)
			x = S.V[S.top[0]--];
		else
			x = S.V[S.top[0]++];
	}
	cout << x << endl;
	return true;
}
//6.show
void show(DblStack s, int i) {
	cout << "s" <<i<<":"<< endl;
	if (i == 0) {
		while (s.top[0] != -1) {//i=0
			cout << s.V[s.top[0]--] << " ";
		}
	}
	else {
		while (s.top[1] != s.m) {//i=1
			cout << s.V[s.top[1]++] << " ";
		}
	}
	cout << endl;
}
int main() {
	DblStack s;
	int m, m1;
	cout << "Input the number " << endl;
	cin >> m;
	if (initDblStack(s, m))
		cout << "init Ok" << endl;
	else cout << "failed" << endl;
	for (int i = 0; i < m; i++) {
		cin >> m1;
		DPush(s, m1 % 2, m1);
	}

	cout << "偶数的部分" << endl;
	show(s, 0);
	cout << "奇数的部分" << endl;
	show(s, 1);

}
发布了122 篇原创文章 · 获赞 14 · 访问量 6182

猜你喜欢

转载自blog.csdn.net/weixin_44001521/article/details/103746528