c++实现数据结构中各种类型的栈

#include<iostream>
//顺序栈静态存储结构定义
/*

#define InitSize 100
typedef int SElemType;
typedef struct {
	SElemType data[InitSize];
	int top;
}SeqStack;


*/
//顺序栈动态存储以及相关操作
/*
#define InitSize 20
typedef int SElemType;
typedef struct {
	SElemType*data;
	int top, maxsize;
}SeqStack;

void StackInit(SeqStack&S)
{
	S.data = (SElemType*)malloc(sizeof(SElemType)*InitSize);
	S.maxsize = InitSize;
	S.top = -1;
}

int Push(SeqStack&S, SElemType val)
{
	if (S.top == (S.maxsize - 1))return 0;
	S.data[++S.top] = val;
	return 1;
}

int Pop(SeqStack&S,SElemType&x)
{
	if (S.top == -1)return 0;
	x = S.data[S.top--];
	return 1;
}

int GetTop(SeqStack&S, SElemType x)
{
	if (S.top == -1)return 0;
	x = S.data[S.top--];
	return 1;
}

int StackEmpty(SeqStack&S)
{
	return S.top == -1;
}

int StackFull(SeqStack&S)
{
	return S.top == S.maxsize - 1;
}

int StackSize(SeqStack&S)
{
	return S.top+1;
}

*/

//双栈共享同一栈空间
/*
#include<iostream>

#define InitSize 20
typedef int SElemType;

typedef struct {
	SElemType*data;
	int top[2], maxsize;
}DblStack;

void StackInit(DblStack&S)
{
	S.data = new SElemType(InitSize);
	S.top[0] = -1;
	S.top[1] = InitSize;
	S.maxsize = InitSize;
}

int Push(DblStack&S, SElemType val, int n)
{
	if (S.top[0] + 1 == S.top[1])return 0;
	if (n == 0) S.data[++S.top[0]] = val;
	else S.data[--S.top[1]] = val;
	return 1;
}

int Pop(DblStack&S, SElemType x,int n)
{
	if (S.top[n] == -1 || S.top[n] == S.maxsize)return 0;
	if (n == 0)x = S.data[S.top[n]--];
	else x = S.data[S.top[1]++];
	return 1;
}

*/

//多个栈存储时
/*
#include<iostream>
using namespace std;

#define InitSize 40
#define InitNum 4
typedef int SElemType;
typedef struct {
	SElemType*data;
	int top[InitNum], bot[InitNum+1], maxsize,n;
}PolyStack;

void StackInit(PolyStack&S)
{
	S.data = new SElemType(InitSize);
	for (int i = 1;i <=InitNum;i++)
	{
		S.bot[i-1] = (i - 1)*InitSize / InitNum;
		S.top[i-1] = S.bot[i-1] - 1;
	}
	S.n = InitNum;
	S.bot[S.n] = InitSize;
	S.maxsize = InitSize;
}

int Push(PolyStack&S, SElemType val, int n)
{
	if (S.top[n - 1] + 1 == S.bot[n])
	{
		int k = 0;
		if (S.n != n) {
			for (int i = n + 1;i <= S.n;i++)
				if (S.top[i - 1] + 1 < S.bot[i])
				{
					k = i;
					break;
				}
		}
		if (k == 0)
		{
			for (int i = n - 1;i >= 1;i--)
			{
				if (S.top[i - 1] + 1 < S.bot[i])
				{
					k = i;
					break;
				}
			}
		}
		if (k == 0)return 0;
		else {
			int temp;
			if (k > n)
			{
				for (int i = S.top[k - 1] + 1;i > S.bot[n];i--)
					S.data[i] = S.data[i - 1];
				for (int i = n + 1;i <= k;i++)
				{
					S.top[i - 1]++;
					S.bot[i - 1]++;
				}
			}
			else
			{
				for (int i = S.bot[k] - 1;i < S.top[n - 1];i++)
					S.data[i] = S.data[i + 1];
				for (int i = k + 1;i <= n;i++)
				{
					S.top[i - 1]--;
					S.bot[i - 1]--;
				}
			}
			S.data[++S.top[n - 1]] = val;


		}
	}
	else S.data[++S.top[n - 1]] = val;
	return 1;
}

int Pop(PolyStack&S, SElemType&x,int n)
{
	if (n<1 || n>S.n)return 0;
	if (S.top[n - 1] == S.bot[n - 1] - 1)return 0;
	else x = S.data[S.top[n - 1]--];
	return 1;
}

int main()
{
	PolyStack S;
	StackInit(S);
	for (int i = 1;i < 20;i++)
		Push(S, i , 1);
	for(int i=0;i<19;i++)
	cout << S.data[i] << endl;
	system("pause");
}
*/

//链式栈
/*
#include<iostream>
using namespace std;

typedef int SElemType;

typedef struct node {
	SElemType data;
	struct node*link;
}LinkNode,*LinkStack;

void StackInit(LinkStack S)
{
	S = new LinkNode;
	S->link = NULL;
}

int Push(LinkStack&S, SElemType val)
{
	LinkStack NewNode = new LinkNode;
	NewNode->data = val;
	NewNode->link = S;
	S = NewNode;
	return 1;
}

int Pop(LinkStack&S, SElemType&x)
{
	if (S == NULL)return 0;
	x = S->data;
	LinkStack B = S;
	S = S->link;
	delete B;
	return 1;
}

int main()
{
	LinkStack S=NULL;
	StackInit(S);
	for (int i = 0;i < 5;i++)
		Push(S, i);
	while (S != NULL)
	{
		SElemType x; 
		Pop(S,x);
		cout << x << endl;
	}
	system("pause");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值