数据结构之——栈的基本操作

1.顺序栈,可以实现以下功能

代码如下

#include "stdio.h"

#define MAXSIZE 100
#define DateType int

typedef struct{
	DateType data[MAXSIZE];
	int top;
}SeqStack,*PSeqStack;

/*创建一个顺序栈,入口参数无,返回一个指向顺序栈的指针,为0表示分配空间失败*/
PSeqStack Init_SeqStack(void)
{
	PSeqStack S;
	S = (PSeqStack)malloc(sizeof(SeqStack));

	if(S)
		S->top = -1;

	return S;
}

/*判断栈是否为空,入口参数:顺序栈,返回值:1表示为空,0表示非空*/
int Empty_SeqStack(PSeqStack S)
{
	if(S->top == -1)
		return 1;

	else
		return 0;
}

/*在栈顶插入一个新元素,入口参数:顺序栈,新元素,返回值:1表示成功,0表示失败*/
int Push_SeqStack(PSeqStack S,DateType x)
{
	if(S->top == MAXSIZE - 1)
	{
		printf("栈满\n");
		return 0;
	}

	else
	{
		S->top++;
		S->data[S->top] = x;
		return 1;
	}
}

/*删除栈顶元素并保留在*x中,入口参数:顺序栈,*x,返回值:1表示成功,0表示失败*/
int Pop_SeqStack(PSeqStack S,DateType *x)
{
	if(Empty_SeqStack(S))
	{
		printf("栈空\n");
		return 0;
	}

	else
	{
		*x = S->data[S->top];
		printf("出栈元素为:%d\n",*x);
		S->top--;
		return 1;
	}
}

/*取得栈顶元素,入口参数:顺序栈,*X,返回值:1表示成功,0表示失败*/
int GetTop_SeqStack(PSeqStack S,DateType *X)
{/*用指针*X带出栈顶值**/
	if(Empty_SeqStack(S))
	{
		printf("栈空\n");
		return 0;
	}
	else
	{
		*X = S->data[S->top];
		printf("栈顶元素是:%d\n",*X);
		return 1;
	}
}

/*销毁栈,入口参数:顺序栈,无返回值**/
void Destory_SeqStack(PSeqStack *S)
{
	if(*S)
		free(*S);
	*S = NULL;
	return;
}

int main()
{
	int n,m,x;
	int *p;

	PSeqStack S;
	S = (PSeqStack)malloc(sizeof(SeqStack));

	S = Init_SeqStack();


	while(1)
	{
		printf("/**这是一个顺序栈,请输入一个相对应的操作**/\n");
		printf("/*************1:判断栈是否为空************/\n");
		printf("/*************2:入栈          ************/\n");
		printf("/*************3:出栈          ************/\n");
		printf("/*************4:获取栈顶元素  ************/\n");
		printf("/*************5:退出          ************/\n");

		scanf("%d",&n);
		switch(n)
		{
			case 1: m = Empty_SeqStack(S);
					if(m == 0)
						printf("栈非空\n");
					if(m == 1)
						printf("栈空\n");
					break;
			case 2: printf("请输入要入栈的元素:\n");
					scanf("%d",&x);
					m = Push_SeqStack(S,x);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 3: m = Pop_SeqStack(S,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 4: m = GetTop_SeqStack(S,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 5: Destory_SeqStack(&S);
					return;
		}
	}
	return 0;
}

 

2.链栈,可以实现以下功能

 

代码如下:

#include "stdio.h"

#define DateType int

typedef struct node{
	DateType data;
	struct node *next;
}StackNode,*PStackNode;

typedef struct{
	PStackNode top;    //指向StackNode类型的指针
}LinkStack,*PLinkStack;

PLinkStack Init_LinkStack(void)
{/*初始化链栈,入口参数:空,返回值:链栈指针,NULL表示初始化失败*/
    PLinkStack S;
    S = (PLinkStack)malloc(sizeof(LinkStack));

    if(S)
    	S->top = NULL;

    return S;
}

int Empty_LinkStack(PLinkStack S)
{/*判断链栈是否为空,入口参数:链栈指针,返回值:1表示栈空,0表示非空*/
    return (S->top == NULL);
}

int Push_LinkStack(PLinkStack S,DateType x)
{/*进栈,入口参数:链栈指针,进栈元素,返回值:1表示成功,0表示失败*/
    PStackNode p;
    p = (PStackNode)malloc(sizeof(StackNode));

    if(!p)
    {
    	printf("内存溢出!\n");
    	return 0;
    }

    p->next = S->top;
    S->top = p;
    p->data = x;
    return 1;
}

int Pop_LinkStack(PLinkStack S,DateType *x)
{/*进栈,入口参数:链栈指针,*x,返回值:1表示成功,0表示失败*/
    PStackNode p;

    if(Empty_LinkStack(S))
    {
   	    printf("栈空,不能出栈!\n");
   	    return 0;
    }
    *x = S->top->data;
	printf("出栈元素为:%d\n",*x);
    p = S->top;
    S->top = S->top->next;
    free(p);
    return 1;
}

int GetTop_LinkStack(PLinkStack S,DateType *X)
{/*取得栈顶元素,入口参数:链栈指针,*X,返回值:1表示成功,0表示失败,用指针*X带出栈顶值*/
	if(Empty_LinkStack(S))
	{
		printf("栈空\n");
		return 0;
	}

	*X = S->top->data;
	printf("栈顶元素是:%d\n",*X);
	return 1;
}


void Destory_LinkStack(PLinkStack *LS)
{/*销毁栈,入口参数:链栈指针地址,无返回值*/
    PStackNode p,q;

    if(*LS)
    {
    	p = (*LS)->top;

    	while(p)
    	{
    		q = p;
    		p = p->next;
    		free(q);
    	}

    	free(*LS);
    }

    *LS = NULL;
}

int main()
{
	int n,m,x;
	int *p;

	PLinkStack S;
	S = (PLinkStack)malloc(sizeof(LinkStack));

	S = Init_LinkStack();


	while(1)
	{
		printf("/***这是一个链栈,请输入一个相对应的操作***/\n");
		printf("/*************1:判断栈是否为空************/\n");
		printf("/*************2:入栈          ************/\n");
		printf("/*************3:出栈          ************/\n");
		printf("/*************4:获取栈顶元素  ************/\n");
		printf("/*************5:退出          ************/\n");

		scanf("%d",&n);
		switch(n)
		{
			case 1: m = Empty_LinkStack(S);
					if(m == 1)
						printf("栈空\n");
					if(m == 0)
						printf("栈非空\n");
					break;
			case 2: printf("请输入要入栈的元素:\n");
					scanf("%d",&x);
					m = Push_LinkStack(S,x);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 3: m = Pop_LinkStack(S,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 4: m = GetTop_LinkStack(S,&p);
					if(m == 1)
						printf("成功\n");
					if(m == 0)
						printf("不成功\n");
					break;
			case 5: Destory_LinkStack(&S);
					return;
		}
	}
	return 0;
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值