堆栈

堆栈和队列:
堆栈可以用来完成数据元素序列的特定转换,队列可以用作数据元素序列的缓冲存储。
顺序队列通常采用顺序循环队列方法实现,因为顺序循环队列可以避免顺序队列的“假溢出”问题。

堆栈:
堆栈只允许在固定一端进行插入和删除数据元素操作。
操作集合:
(1)初始化StackInitiate(S):初始化堆栈S。
(2)判断堆栈是否为空StackNotEmpty(S):若堆栈非空,则返回1;否则返回0。
(3)入栈StackPush(S, x):在堆栈S 的当前栈顶插入数据元素x。
(4)出栈StackPop(S, d):把堆栈S 的当前栈顶数据元素删除并由参数d 带回。若出栈成功,则返回1;否则返回0。
(5)取栈顶数据元素StackTop(S, d):取堆栈S 的当前栈顶数据元素并由参数d 带回。若取到数据元素,则返回1;否则返回0。

	顺序堆栈的表示与实现:
		typedef struct
		{
			DataType stack[MaxStackSize];
			int top;
		} SeqStack;
		
		void StackInitiate(SeqStack *S) //初始化顺序堆栈S
		{
			S->top = 0; //初始化栈顶下标值
		}
		
		int StackNotEmpty(SeqStack S)
		//判断顺序堆栈S 非空否,非空则返回1,否则返回0
		{
			if(S.top <= 0) return 0;
			else return 1;
		}
		
		int StackPush(SeqStack *S, DataType x)
		//把数据元素值x 存入顺序堆栈S 中,入栈成功则返回1,否则返回0
		{
			if(S->top >= MaxStackSize)
			{
				printf("堆栈已满无法插入! \n");
				return 0;
			}
			else
			{
				S->stack[S->top] = x;
				S->top ++;
				return 1;
			}
		}
		
		int StackPop(SeqStack *S, DataType *d)
		//取出顺序堆栈S 的栈顶数据元素值由参数d 带回,出栈成功则返回1,否则返回0
		{
			if(S->top <= 0)
			{
				printf("堆栈已空无数据元素出栈! \n");
				return 0;
			}
			else
			{
				S->top--;
				*d = S->stack[S->top];
				return 1;
			}
		}
		int StackTop(SeqStack S, DataType *d)
		//取顺序堆栈S 的当前栈顶数据元素值由参数d 带回,成功则返回1,否则返回0
		{
			if(S.top <= 0)
			{
				printf("堆栈已空! \n");
				return 0;
			}
			else
			{
				*d = S.stack[S.top - 1];
				return 1;
			}
		}
		
	链式堆栈的表示与实现:
		typedef struct snode
		{
			DataType data;
			struct snode *next;
		} LSNode;
		
		void StackInitiate(LSNode **head)
		//初始化带头结点链式堆栈
		{
			*head = (LSNode *)malloc(sizeof(LSNode));
			(*head)->next = NULL;
		}
		
		int StackNotEmpty(LSNode *head)
		//判断堆栈是否非空,非空,返回1;空,返回0
		{
			if(head->next == NULL) return 0;
			else return 1;
		}
		
		void StackPush(LSNode *head, DataType x)
		//把数据元素x 插入链式堆栈head 的栈顶作为新的栈顶
		{
			LSNode *p;
			p = (LSNode *)malloc(sizeof(LSNode));
			p->data = x;
			p->next = head->next; //新结点链入栈顶
			head->next = p; //新结点成为新的栈顶
		}
		
		int StackPop(LSNode *head, DataType *d)
		//出栈并把栈顶元素由参数d 带回,出栈成功则返回1,否则返回0
		{
			LSNode *p = head->next;
			if(p == NULL)
			{
				printf("堆栈已空出错!");
				return 0;
			}
			head->next = p->next; //删除原栈顶结点
			*d = p->data; //原栈顶结点元素赋予d
			free(p); //释放原栈顶结点内存空间
			return 1;
		}
		
		int StackTop(LSNode *head, DataType *d)
		//取栈顶元素并把栈顶元素由参数d 带回
		{
			LSNode *p = head->next;
			if(p == NULL)
			{
				printf("堆栈已空出错!");
				return 0;
			}
			*d = p->data;
			return 1;
		}
		
		void Destroy(LSNode *head)
		{
			LSNode *p, *p1;
			p = head;
			while(p != NULL)
			{
				p1 = p;
				p = p->next;
				free(p1);
			}
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值