【数据结构】顺序栈

1.栈

1.1栈的概念

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
image.png
栈顶(Top):线性表允许进行插入和删除的一端。
栈底(base):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素。

1.2 栈的基本操作

void StackInit(STp) //初始化栈
voidStackPush(ST
p,intx) //进栈
voidStackPop(STp) //出栈
voidStackDestory(ST
p) //销毁栈
intStackTop(STp) //获取栈顶人数
voidStackShow(STp) //打印所有栈内元素
intStackSize(ST
p) //获取栈的现有元素个数
boolStackEmpty(ST*p) //判断栈是否为空

1.3 顺序栈的实现

采用顺序存储的栈称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
栈的顺序存储类型可以用以下表示:

typedef struct stack
{
	int* arr;
	int top;
	int capcity;
}ST;

栈顶指针:ST.top,初始时设置ST.top = 0
进栈操作:栈不满时,用下表arr[top]进行赋值,如果栈满了就进行扩容。
出栈操作:栈非空时,将栈顶指针减1
栈空条件:ST.top == 0
栈满条件:ST.top == capcity - 1
栈长:ST.top + 1
栈的基本操作
image.png

1.4 函数实现

初始化

void StackInit(ST* p)
{
	p->arr = (int*)malloc(sizeof(int) * 4);
	p->capcity = 4;
	p->top = 0;
}

入栈

void StackPush(ST* p, int x)
{
	if (p->top == p->capcity)
	{
		int* temp = (int*)realloc(p->arr, sizeof(int) * (p->capcity * 2));
		if (temp != NULL)
		{
			p->arr = temp;
			p->capcity *= 2;
		}
		p->arr[p->top] = x;
		p->top++;
	}
	else
	{
		p->arr[p->top] = x;
		p->top++;
	}
}

出栈

void StackPop(ST* p)
{
	assert(p);
	assert(p->top > 0);
	if (StackEmpty(p) == true)
	{
		printf("ջΪ");
		return;
	}
	else
	{
		p->top--;
	}
}

获取栈顶元素

int StackTop(ST* p)
{
	assert(p);
	assert(p->top > 0);
	return p->arr[p->top-1];
}

判断栈是否为空

bool StackEmpty(ST* p)
{
	assert(p);
	return p->top == 0;
}

打印栈里现有元素

void StackShow(ST p)
{
	if (StackEmpty(&p) == 1)
	{
		printf("ջΪ");
		return;
	}
	else
	{
		for (int i = p.top-1; i >=0; i--)
		{
			printf("%d ", p.arr[i]);
		}
	}
}

获取栈的现有元素个数

int StackSize(ST* p)
{
	assert(p);
	return p->top;
}

销毁栈

void StackDestory(ST* p)
{
	if (StackEmpty(p) == true )
	{
		printf("ջΪ");
		return;
	}
	else
	{
		free(p->arr);
		p->arr = NULL;
		p->top = 0;
		p->capcity = 0;
	}
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef struct stack
{
	int* arr;
	int top;
	int capcity;
}ST;
bool StackEmpty(ST* p);
void StackInit(ST* p)
{
	p->arr = (int*)malloc(sizeof(int) * 4);
	p->capcity = 4;
	p->top = 0;
}
void StackPush(ST* p, int x)
{
	if (p->top == p->capcity)
	{
		int* temp = (int*)realloc(p->arr, sizeof(int) * (p->capcity * 2));
		if (temp != NULL)
		{
			p->arr = temp;
			p->capcity *= 2;
		}
		p->arr[p->top] = x;
		p->top++;
	}
	else
	{
		p->arr[p->top] = x;
		p->top++;
	}
}
void StackPop(ST* p)
{
	assert(p);
	assert(p->top > 0);
	if (StackEmpty(p) == true)
	{
		printf("ջΪ");
		return;
	}
	else
	{
		p->top--;
	}
}
void StackDestory(ST* p)
{
	if (StackEmpty(p) == true )
	{
		printf("ջΪ");
		return;
	}
	else
	{
		free(p->arr);
		p->arr = NULL;
		p->top = 0;
		p->capcity = 0;
	}
}
int StackTop(ST* p)
{
	assert(p);
	assert(p->top > 0);
	return p->arr[p->top-1];
}
bool StackEmpty(ST* p)
{
	assert(p);
	return p->top == 0;
}
void StackShow(ST p)
{
	if (StackEmpty(&p) == 1)
	{
		printf("ջΪ");
		return;
	}
	else
	{
		for (int i = p.top-1; i >=0; i--)
		{
			printf("%d ", p.arr[i]);
		}
	}
}
int StackSize(ST* p)
{
	assert(p);
	return p->top;
}
int main()
{
	int max = 0, length = 0;
	ST stack;
	StackInit(&stack);
	StackPush(&stack, -1);
	char* s = ")()())";
	for (int i = 0; i < strlen(s); i++)
	{
		if (*(s + i) == '(')
		{
			StackPush(&stack, i);
		}
		else
		{
			if (StackSize(&stack) == 1)
			{
				StackPop(&stack);
				StackPush(&stack, i);
				length = 0;
			}
			if (StackSize(&stack) > 1)
			{
				StackPop(&stack);
				length = i - StackTop(&stack);
				max = max < length ? length : max;
			}
		}
	}
	printf("%d", max);
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值