栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入删除操作的一端称为栈顶,另一端称为栈底。不含任何元素的栈称为空栈

栈最大的特点就是:先进后出,后进先出

栈可分为顺序栈和链式栈

1)顺序栈所有的操作时间复杂度都是O(1)

2)链式栈就不一定了得看你的栈顶位于链表的头还是尾(一般建议将栈顶设计在链表头的位置,这样入栈出栈操作都是O(1)。否则入栈是O(1)出栈是O(N)。可以思考一下原因 --> 因为你删除掉链表的最后一个元素,可是他的前一个元素你得遍历整个链表才能得知,进而才能重新确定栈顶位置)

在此我实现顺序栈(操作相对都简单些^0^)

#define MAX (100)
typedef char SDataType;

typedef struct stack
{
	//定义一个数组存放数据
	SDataType array[MAX];
	//表示栈内有效元素的个数,也表示此时栈顶位置的下标
	int top;
}stack;

我的栈中实现了以下的基本操作

//栈的初始化
void stackInit(stack *ps);

//入栈操作
void stackPush(stack *ps, SDataType data);

//出栈操作
void stackPop(stack *ps);

//求得栈顶元素
SDataType stackTop(stack *ps);

//判断是否为空栈
int stackIsEmpty(stack *ps);

//求得栈的大小(含数据的个数)
int stackSize(stack *ps);

//将栈进行拷贝
void stackCopy(stack *psDest, stack *psSrc);

1)初始化

void stackInit(stack *ps)
{
	assert(ps != NULL);
	ps->top = 0;
}

2)入栈

void stackPush(stack *ps, SDataType data)
{
	assert(ps != NULL);
	assert(ps->top < MAX);
	ps->array[ps->top] = data;
	ps->top++;
}

3)出栈

void stackPop(stack *ps)
{
	assert(ps != NULL);
	assert(ps->top > 0);
	ps->top--;
}

4)栈顶元素

SDataType stackTop(stack *ps)
{
	assert(ps != NULL);
	assert(ps->top > 0);
	return ps->array[ps->top - 1];
}

5)是否为空栈

//空栈返回1,否则返回0
int stackIsEmpty(stack *ps)
{
	assert(ps != NULL);
	if (ps->top == 0){
		return 1;
	}
	else{
		return 0;
	}
}

6)栈大小

int stackSize(stack *ps)
{
	assert(ps != NULL);
	return ps->top;
}

7)栈拷贝

void stackCopy(stack *psDest, stack *psSrc)
{
	assert(psDest != NULL);
	assert(psSrc != NULL);
	psDest->top = psSrc->top;
	memcpy(psDest->array, psSrc->array, sizeof(SDataType)* psSrc->top);
}

总结:了解了之前顺序表博客的内容后,相信对栈的操作就更容易了。因为栈只能在一端进行操作

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值