线性结构--堆栈常用操作

一、后缀表达式求法

例:562/+34*-
中缀表达式:5+6/2-3*4=-4
进行运算的时候先拿出来数的放运算符右边,后拿出来的放运算符左边


在这里插入图片描述


二、栈的顺序存储实现
1、定义声明
typedef struct SNode *Stack;
struct SNode{
	ElemenType Data[MAXSIZE];
	int Top;
}; 

2.顺序栈的创建
Stack CreateStack()
{
	Stack S=(Stack)malloc(sizeof(struct SNode));
	S->Data=(ElemenType *)malloc(MAXSIZE*sizeof(ElemenType));
	S->Top=-1;
	return S;
}

3、入栈
void Push(Stack PtrS,ElemenType item)
{
	if(PtrS->Top==MAXSIZE-1)
	printf("堆栈满");
	else
	{
		PtrS->Data[++(PtrS->Top)]=item;//堆栈为空时pop为-1 
		return ;
	 } 
}

4、出栈
ElemenType Pop(Stack PtrS)
{
	if(PtrS->Top==-1)
	printf("堆栈空");
	else
	return PtrS->Data[PtrS->Top--]; 
 } 

三、栈的顺序存储实现(一个数组实现两个堆栈)
1、定义声明和初始化Top1,Top2
typedef struct SNode *Stack;

struct SNode{
	ElemenType Data[MAXSIZE];
	int Top1;
	int Top2;
};

Stack.Top1=-1;
Stack.Top2=MAXSIZE;

2、入栈
bool Push(Stack S,ElemetType X,int Tag)//Tag控制对第几个堆栈操作 
{
	if(S->Top2-S->Top1==1 )
	{
		printf("堆栈满");
		return false; 
	}
	else
	{
		if(Tag==1)
		{
			S->Data[++S->Top1=X];
		}
		else
		{
			S->Data[--S->Top2=X];
		}
		return true;
	}
}

3、出栈
ElemenType Pop(Stack S,int Tag)
{
	if(Tag==1)
	{
		if(S->Top1==-1)
			printf("堆栈空"); 
		else
			return S->Data[(S->Top1)--];
	}
	else
	{
		if(S->Top2==MAXSIZE)
		printf("堆栈空");
		else
		return S->Data[(S->Top2)++]; 
	}
}

四、栈的链式存储实现

使用链表实现时,插入和删除操作只能在链表的头部进行,栈顶指针Top就是链表的头指针。如果在链表的尾部进行,插入时没有问题,可以连接一个新结点。如果删除,删除后不知道前一个结点是谁,再进行插入时就不知道向哪插入。


1、声明定义:
typedef struct SNode *Stack;
struct SNode{
	ElemenType Data;
	Stack Next;
};

2、创建一个堆栈的头结点

在这里插入图片描述

Stack CreatStack()
{
	Stack S;
	S=(Stack)malloc(sizeof(struct SNode));
	S->Next=NULL;
	return S;
}

3、判断堆栈是否为空
bool IsEmpty(Stack S)
{
	if(S->Next==NULL)//插入的时候总是向头结点后插入 
	return false;
	else
	return true;
}

4、入栈
bool Push(Stack S,ElemenType X)//插入的时候总是向头结点后插入 
{
	Stack tmp;
	tmp=(Stack)malloc(sizeof(struct SNode));
	tmp->Data=X;
	tmp->Next=NULL;
	
	tmp->Next=S->Next;
	S->Next=tmp;
	
	return true;
 } 

5、出栈
ElemenType Pop(Stack S)
{
	Stack tmp;
	ElemenType back;
	if(IsEmpty(S))
	{
		printf("stack empty");
		return ; 
	}
	else
	{
		back=S->Next->Data;
		tmp=S->Next;
		S->Next=tmp->Next;
		free(tmp);
	}
	return back;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值