顺序栈,链式栈的操作(c语言实现)

顺序栈

定义:利用顺序储存结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。
栈顶的位置不存放元素
操作
1.初始化栈
2.判断是否为空栈
3.向栈中压入元素
4.取栈顶元素
5.元素出栈
说明:取栈顶元素和元素出栈的本质是不同的,后面有代码说明
在这里插入图片描述图片转自https://blog.csdn.net/qq_25775935/article/details/88558779

未存放元素时,top指向a[0]的位置,如果放入了一个元素,则top指向a[1]的位置

链式栈

定义:采用链式储存结构实现的栈,一般用单链表来表示。
栈的操作都是在栈顶进行的,所以要设置一个头结点,头结点中不存放数据
操作
同上
在这里插入图片描述
图片转自:https://blog.csdn.net/qq_25775935/article/details/88558779

#pragma once
# include <stdio.h>
# include <stdlib.h>
# define MaxSize 10
//顺序栈
//---------------------------------------------------------
typedef struct stack
{
 	int data[MaxSize];
 	int top;
}Seqstack;
//初始化
int InitStack(Seqstack *S)
{
 	S->top = 0;
 	return 1;
}
//判断是否为空
int Stackempty(Seqstack *S)
{
 	if (S->top == 0)
  	return 1;
 	else
  	return 0;
}
//元素入栈,栈顶始终不能存放元素
void PushItemStack(Seqstack *S, int e)
{
 	if (S->top > MaxSize)
	 {
  		printf("栈已满,无法入栈!\n");
  		return;
 	}
 	else
	 {
 		 S->data[S->top] = e;
 		 S->top++;
	 }
}
//元素出栈
int PopStack(Seqstack* S,int *e)
{
	 if (Stackempty(S))
 	{
 		 printf("栈已空,无法删除元素!\n");
  		return 0;
 	}
 	else
 	{
 		 S->top--;
  		*e = S->data[S->top];
 		 return 1;
	 }
}
//取栈顶元素
int GetStackTop(Seqstack *S, int *e)
{
	 if (Stackempty(S))
 	{
 		 printf("栈已空,无法取栈顶元素!\n");
 		 return 0;
 	}
 	else
 	{
  		//注意:取栈顶元素并不是要让栈顶下移
  		//只要
 	 *e = S->data[S->top - 1];
  	return 1;
	 }
}
//--------------------------------------------------------
//链式栈
typedef struct NODE
{
 	struct NODE*next;
 	int data;
}SNODE;
void StackInit(SNODE *head)
{
	 head = (SNODE*)malloc(sizeof(NODE));
	 head->next = NULL;
}
int Stackempty(SNODE *head)
{
 	if (head->next == NULL)
 	{
 		 printf("栈已空!\n");
 		 return 1;
 	}
 	else
 	 return 0;
}
//元素入栈
void StackPush(SNODE *head, int e)
{
 	SNODE *t = (SNODE*)malloc(sizeof(NODE));
 	t->data = e;
	 t->next = head->next;
	 head->next = t;
}
//抛出栈顶
int StackTop(SNODE *head, int *e)
{
 	SNODE *t = (SNODE*)malloc(sizeof(NODE));
 	t = head->next;
 	*e = t->data;
	 return 1;
}
//出栈
int StackPop(SNODE *head, int *e)
{
 	if (Stackempty(head))
 	{
	  printf("栈已空,元素无法出栈!\n");
	  return 0;
	 }
	 else
	 {
 	 *e = head->data;
	  return 1;
	 }
}

主函数:

# include <stdio.h>
# include <stdlib.h>
# include "stack.h"
int main()
{
 	Seqstack S;
 	InitStack(&S);
 	int a[10];
 	printf("请输入数据!\n");
 	for (int i = 0; i < 10; i++)
 	{
  		scanf("%d", &a[i]);
  		PushItemStack(&S, a[i]);
 	}
	 printf("栈的长度为:%d\n", S.top);
	 printf("抛出栈顶元素!\n");
 	 int e;
	 GetStackTop(&S, &e);
	 printf("栈顶元素为:%d",e);
	 printf("\n");
	 printf("元素出栈!\n");
 	 int d;
	 for (int j = 0; j < 10; j++)
	 {
  		PopStack(&S, &d);
  		printf("%3d", d);
 	}
 	printf("------------------------------------------\n");
 	printf("将用链式栈!\n");
 	printf("请输入数据!\n");
 	SNODE *L;
 	L = (SNODE*)malloc(sizeof(NODE));
	StackInit(L);
 	int b[10];
 	for (int i = 0; i < 10; i++)
 	{
  		scanf("%d", &b[i]);
  		StackPush(L, b[i]);
 	}
 	printf("抛出栈顶元素!\n");
 	int m;
 	StackTop(L, &m);
 	printf("栈顶元素为:%d\n", m);
 	printf("元素出栈!\n");
 	L = L->next;
 	for (int i = 0; i < 10; i++)
 	{
  		StackPop(L, &m);
  		L = L->next;	//指针往后指
  		printf("%3d", m);
 	}	
 	system("pause");
 	return 0;
}

代码运行截图
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值