大话数据结构(六)栈和队列——栈的相关知识

1.栈和队列的区别

栈是一种LIFO结构,即后进先出,它是一种线性表,而我们知道线性表是由数组组成的
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。

2.创建一个普通栈

这种结构的定义、初试化、入栈操作、出栈操作可以由以下代码表示:

// 4.1stack.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#define MAXSIZE 20
#define TRUE true
#define ERROR false
#define YES true
#define NO false
typedef bool Status;
typedef int SElemType;

typedef struct 	//结构体定义
{
	SElemType data[MAXSIZE];
	int top;
}SqStack;	


Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
int main()
{
	using namespace std;
	SElemType SE;
	SElemType *Address = &SE;
	SqStack S1 = { {0},-1 };
	bool judge = 0;
	cout << "入栈操作:";
	cout << S1.data[0]<<endl;	//未入栈之前的数组元素全为0
	judge = Push(&S1, 1);	//将数值1入栈
	cout <<judge<<endl<< S1.data[0];	//此时入栈操作成功并且数组第一个元素变为1
	cout << "出栈操作:";
	judge = Pop(&S1, Address);	//将出栈的元素存入Address中
	cout << judge<<endl<<S1.top;	//此时输出结果top为-1表示此时为一个空栈

}

Status Push(SqStack *S, SElemType e)	//入栈操作
{
	if ((S->top) == MAXSIZE - 1)
		return ERROR;
	S->top++;
	S->data[S->top] = e;
	return TRUE;
}

Status Pop(SqStack *S, SElemType *e)	//出栈操作
{
	if ((S->top) == -1)
		return ERROR;
	*e = S->data[S->top];
	S->top--;
	return TRUE;
}

3.创建一个共享数组栈

我们可以创建两个栈共享一个数组,这样做的原因一定程度上是为了数据内存的聚集性。
代码如下:

typedef struct 
{
	SElemType data[MAXSIZE];
	int top1;
	int top2;
}SqDoubleStack;//定义一个共享栈 其中包含两个指针

/*插入元素为新的栈顶元素*/
Status Push(SqDoubleStack *S, SElemType e, int stacknumber)
{
	if (S->top1 + 1 == S->top2)
		return ERROR;	//说明栈满
	if (stacknumber == 1)//栈1元素入栈
		S->data[++S->top1] = e;
	else if(stacknumber == 2)//栈2元素入栈
		S->data[--S->top2] = e;
	return TRUE;
}

/*删除元素*/
Status Pop(SqDoubleStack *S, SElemType *e, int stacknumber)
{
	if ((S->top1 == -1) || S->top2 == n)	//到栈底无法删除
		return FALSE;
	if (stacknumber == 1)//删除栈1的元素
		*e = S->data[S->top1--];	//将删除的元素保存到预存地址中
	else if (stacknumber == 2)	//删除栈2的元素
		*e = S->data[S->top2++];
	return TRUE;
}

4.创建一个链式栈

相对于顺序存储结构,链式结构每个元素并不是按顺序存储在连续的地址中,因此对于链式栈来说,基本不存在栈满的情况,除非计算机内存已满。
链式栈的结构代码如下:

typedef struct StackNode
{
	SElemType data;
	struct StackNode *next;	//是不是想到递归叻 嗯哼
}StackNode,*LinkStackPtr;

typedef struct
{
	LinkStackPtr top;
	int count;
}LinkStack;

进栈操作

Status Push(LinkStack *S,SElemType e)
{
	LinkStackPtr s = new StackNode;	//分配动态内存
	s->data = e;
	s->next=S->top;	//这两列代码不能交换
	S->top = s;	//这两列代码不能交换
	S->count++;
	return TURE;
}

出栈操作

Status Pop(LinkStack *S,SElemType *e)
{
	LinkStackPtr p;
	if(StackEmpty(*S))
		return ERROR;
	*e = S->top->data;	//将要删除的元素保存在预存空间
	p = 0S->top;
	S->top = S->top->next;
	delete e;	//释放空间
	S->count--;
	return TURE;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值