【数据结构】栈

定义和特点

  1. 栈(Stack):限定在表的一端进行插入和删除操作的线性表
  2. 栈顶(top):允许插入和删除的一端
  3. 栈底(bottom):表的固定一端
  4. 空栈:不含数据元素的栈
  5. 入栈(Push):插入元素
  6. 出栈(Pop):删除元素

特点

后进先出(LIFO)
栈

顺序栈的基本操作

栈的初始化:Init_Stack(s)

初始条件:栈s不存在
操作结果:构造一个空栈

数据类型定义,结构体
typedef struct{
	DataType data[MaxSize];
	int top;
}SeqStack;
初始化栈
SeqStack *Init_Stack()
{
	SeqStack *s;
	s = new SeqStack;
	s->top = -1;
	return s;
}

判断栈空/栈满:Empty_Stack(s)/Full_Stack(s)

初始条件:栈s存在
操作结果:若s为空栈/栈满,返回1,否则返回0

栈空
int Empty_SeqStack(SeqStack *s)
{
	if(s->top == -1)
		return 1;
	else
		return 0;
}
栈满
int Empty_SeqStack(SeqStack *s)
{
	if(s->top == MaxSize - 1)
		return 1;
	else
		return 0;
}

入栈 Push_SeqStack(s, x)

初始条件:栈s存在
操作结果:将栈s的栈顶插入一个新元素x,x成为新的栈顶元素

int Push_SeqStack(SeqStack *s, DataType x)
{
	if(s->top >= MaxSize - 1) //在栈不满的情况下可以入栈
		return 0;
	else
	{
		s->top++;
		s->data[s->top] = x;
		return 1;
	}
}

出栈 Pop_SeqStack(s, x)

初始条件:栈s存在且非空
操作结果:将栈s的栈顶元素从栈中删除

int Pop_SeqStack(SeqStack *s, DataType x)
{
	if(Empty_SeqStack(s))
		return 0;
	else
	{
		x = s->data[s->top + 1];
		s->top--;
		return 1;	
	}
}

读取栈顶元素 GetTop_SeqStack(s, x)

初始条件:栈s存在且非空
操作结果:读栈顶元素,栈不变化

int GetTop_SeqStack(SeqStack *s, DataTye x)
{
	if(Empty_SeqStack(s))
		return 0;
	else
	{
		x = s->data[s->top];
		return 1;	
	}
}

说明

  1. 对于顺序栈,入栈时先判断是否为满,栈满时不能入栈,否则出现空间溢出,引起上溢。
  2. 出栈和读栈顶元素操作,先判断栈是否为空,栈空时不能操作,否则产生错误下溢。通常把栈作为一种控制转移的条件。

补充:判断回文的算法

1234554321就是回文

void Palindroms_SeqStack(char str[], int n)
{
	int i;
	Init_SeqStack(S1);
	for(i = 0; i < n/2; i++)
		Push_SeqStack(S1, str[i]);
	if(n % 2 != 0)
		i++;
	while(i < n)
	{
		Pop_SeqStack(S1, ch);
		if(ch != str[i])      //字符不同,直接退出算法
		{
			printf("The string is not palindrome\n");
			return;	
		}
		i++;                //字符相同,比较下一个
	}
	printf("The string is palindrome\n"); //比较字符全部相同,确定是回文
}

链栈的基本操作

链栈的初始化

链栈的数据类型描述

typedef struct node
{
	DataType data;
	struct node *next;
}StackNode, *LinkStack;

说明

  1. 若把链栈定义为 LinkStack top,则栈顶元素为:top->data
  2. 栈空条件:top == NULL链栈不会满,因为是链表

链栈的初始化

LinkStack Init_LinkStack()
{
	LinkStack top;
	top = NULL;
	return top;
}

判断链栈为空

int Empty_LinkStack(LinkStack top)
{
	if(top == NULL)
		return 1;
	else
		return 0;
}

链栈的入栈

LinkStack Push_LinkStack(LinkStack top, DataType x)
{
	StackNode *s;
	s = new StackNode; //申请新的节点空间
	s->data = x;
	s->next = top;
	top = s;
	return top;
}

链栈的出栈

LinkStack Pop_LinkStack(LinkStack top, DataType *x)
{
	StackNode *p;
	if(top == NULL)
	{
		printf("The stack is empty\n");
		return 0;	
	}
	else
	{
		*x = top->data;     //保存栈顶元素,指针可随意访问
		p = top;			
		top = top->next;	//置新的栈顶指针
		delete p;			//释放原栈顶元素节点空间
		return top;			//出栈成功,返回新的栈顶指针
	}
}

取链栈栈顶元素

int GetTop_LinkStack(LinkStack top, DataType x)
{
	if(top == NULL)
	{
		printf("The stack is empty\n");
		return 0;
	}
	x = top->data;
	return x;
}

计算不带头节点链栈中节点个数的算法

int LsCount(LinkStack s)
{
	StackNode *p;
	int n = 0;
	p = s;
	while(p != NULL)
	{
		n++;
		p = p->next;
	}
	return n;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值