数据结构学习之栈

数据结构定义

表尾进行 插入 和 删除 操作的线性表

栈_顺序存储

#define StackSize 20//顺序栈的初始分配空间
typedef string ElemType;//控制栈中存的数据类型

typedef struct SqStack{
	ElemType data[MaxSize];//存放栈元素的数组
	int top;//栈顶指针
}SqStack;
创建空栈(初始化栈)

//创建空栈(初始化栈)
void Create(SeqStack &S){
	S.top = -1;
}
1.判空
//判空
int IsEmpty(SeqStack S){
	if (S.top == -1) return 1;
	else return 0;
}
2.判满
//判满
int IsFull(SeqStack S){
	if (S.top >= MaxSize - 1) return 1;
	else return 0;
}
3.入栈
//入栈
void Push(SeqStack &S, int x){
	if (IsFull(S)){return -1;}
	S.data[++S.top] = x;//x入栈
}
4.出栈
//出栈
void Pop(SeqStack &S, int &x){
	if (IsEmpty(S)){return -1;}
	x = S.data[S.top--];//栈顶元素值赋给x后出栈
}
5.输出顺序栈
//输出顺序栈
void Display(SeqStack S)
{if (IsEmpty(S)){return -1;}
	int i = S.top;//定义循环控制变量i,让i取栈顶位置
	while (i >= 0){
		 S.data[i--]};//输出栈中元素
}
主函数
//主函数
void main()
{
	SeqStack S;//定义栈
	Create(S);//创建空栈
	Push(S, 1);//入栈
	Push(S, 2);//入栈
	Display(S);
	int x;
	Pop(S, x);//出栈
	Display(S);
	Push(S, 3);//入栈
	Display(S);
}

栈_顺序存储(共享栈)

栈空:
两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;

栈满:
仅当两个栈顶指针(top1-top0=1)时,判断为栈满。

进栈:
当0号栈进栈时,top0先加1,再赋值;1号栈进栈时,top1先减1,再赋值。

出栈:
当0号栈出栈时,先赋值,top0再减1;1号栈出栈时,先赋值,top1再加1。
#define MaxSize 20//顺序栈的初始分配空间
typedef string ElemType;//控制栈中存的数据类型

struct Two_way_Stack{/*双向堆栈*/ 
	ElemType data[MaxSize];
	int top0;
	int top1;
};

栈_链式存储 单向链

typedef string ElemType;//控制栈中存的数据类型

typedef struct StackNode{
	ElemType data;	//结点的数据元素
	struct StackNode *next;	//结点的指针域
}StackNode,*LinkStack;

//StackNode* (指针类型)为指向栈中某结点的指针,用该指针代表此结点
//LinkStack (指针类型)为指向栈中头结点的指针(即为头指针)

using namespace std;

//结点定义bn
struct StackNode{
	ElemType data;//数据域
	StackNode *next;//指针域
};

//链栈定义
struct LinkStack{
	Node *top;
};
创建空链栈
//创建空链栈
void Create(LinkStack &S){
	S.top = NULL;
}
1.判空

//判空
int IsEmpty(LinkStack S){
	if (S.top == NULL) return 1;
	else return 0;
}
3.判满
链表栈,没有满的情况
3.入栈
//入栈
void Push(LinkStack &S, int x){
	Node *NewNode;//新结点
	NewNode = new Node;//新结点申请内存
	NewNode->data = x;//新结点数据域赋值
	NewNode->next = NULL;//新结点指针域赋值
	if (IsEmpty(S))//如果链栈为空
		S.top = NewNode;//链栈顶指针指向新结点
	else//如果链栈非空
	{
		NewNode->next = S.top;//新结点前插入链栈
		S.top = NewNode;//更新栈顶指针
	}
}
4.出栈
//出栈
void Pop(LinkStack &S, int &x){
	if (IsEmpty(S)){
		return; //什么都不做
	}
	Node *p = S.top;//定义探测指针p并指向栈顶结点
	if (p->next == NULL)//如果链栈仅含一个结点
	{
		x = p->data;//获取栈顶结点值
		S.top = NULL;//置链栈为空
		delete p;//删除原栈顶结点
	}
	else//如果链栈中至少含有两个结点
	{
		x = p->data;//获取栈顶结点值
		S.top = S.top->next;//栈顶指针后移
		delete p;//删除原栈顶结点
	}
}
5.输出链栈
//输出链栈
void Display(LinkStack S){
	//如果链栈为空
	if (IsEmpty(S)){
		return;//什么都不做
	}
	Node *p = S.top;//定义探测指针p并指向栈顶结点
	while (p != NULL){
		p = p->next;//p后移
	}
}
main
//主程序
void main()
{
	LinkStack S;//定义栈
	Create(S);//创建空栈
	Push(S, 1);//入栈
	Push(S, 2);//入栈
	Display(S);
	int x;
	Pop(S, x);//出栈
	Display(S);
	Push(S, 3); //入栈
	Display(S);
}


栈_链式存储 双向链(共享栈)


typedef int STDataType;//数据类型

//定义各个节点
typedef struct StackNode {
    struct Stack* next;
    struct Stack* prev;
    STDataType data;
}STNode;

//定义一个栈
typedef struct Stack {
    STNode* top;
    int size;
}Stack;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值