【C语言】实现数据结构——栈,队列

栈和队列都常用的数据结构,这里使用C语言实现栈和队列,


一、栈

栈:是一种特殊的线性表,其只允许在一端出数据和入数据,插入数据和删除数据的一端加栈顶,另一端叫栈底。其数据遵守先进后出的原则(Last in First out)。 

因为这个特点那么如果进入一段数据是 1 2 3 4 5,那么其出数据就是反的 5 4 3 2 1。 

压栈(push):往栈顶插入数据。

出栈(pop):把数据在栈顶删除。

实现:


typedef int STdatatype;

typedef struct stack
{
	STdatatype *arr;
	int top;
	int capacity;

}stack;

//初始化
void StackInit(stack* ps);
//销毁堆栈
void StackDestory(stack* ps);
//压栈
void StackPush(stack* ps, STdatatype x);
//出栈
void StackPop(stack* ps);
//取栈顶的值
STdatatype StackTop(stack* ps);
//判断栈是否为空
bool StackIsEmpty(stack* ps);
//栈的长度
int StackSize(stack* ps);

void StackInit(stack* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = 0;
	ps->top = 0;

}

void StackDestory(stack* ps)
{
	assert(ps);

	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void StackPush(stack* ps, STdatatype x)
{
	assert(ps);

	if (ps->capacity == ps->top){
		int newCapacity  = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STdatatype* p = (STdatatype*)realloc(ps->arr, sizeof(STdatatype)* newCapacity);
		if (p==NULL)
		{
			perror("申请内存失败\n");
			exit(0);
		}
		ps->capacity = newCapacity;
		ps->arr = p;
	}
	ps->arr[ps->top] = x;
	ps->top++;

}

void StackPop(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	ps->top--;
}

STdatatype StackTop(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	return ps->arr[ps->top-1];
}

bool StackIsEmpty(stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

int StackSize(stack* ps)
{
	assert(ps);
	assert(!StackIsEmpty(ps));
	return ps->top;
}

这里使用了数组来模拟实现栈的特点。

测试:

PS:栈是不能被遍历的,要访问下一个数据,必须把现在的数据弹出栈顶。 

PS:但是,还是要注意,并不是遍历的时候,出数据就只能是5 4 3 2 1,如果这里一边访问一边出数据,数据还是顺序的。

举例:

二、队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 (First In First Out)
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。

因为其只能在队头出数据,所以进入一段数据 1 2 3 4 5,那么出数据的顺序也该是 1 2 3 4 5。

实现:

typedef 
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为AI机器人,本人无法亲身经历面试,但可以向您介绍嵌入式c语言方面的一些知识和技巧。 首先,嵌入式系统是以某种特定功能为目的,集成在其他产品中的计算机系统,如汽车控制系统、家电控制系统等,其最大的特点是要求实时性高、资源有限、功耗小。因此,面试可能会涉及嵌入式系统的相关知识。 其次,c语言是嵌入式系统最常用的编程语言之一,因此掌握c语言基础知识也非常重要。这包括数据类型、指针、数组、结构体等基本概念,以及常见的编程语法和语句,如循环、条件判断、函数调用等。 同时,面试可能会对c语言编程能力进行考察。这涵盖了算法设计能力、程序调试能力、代码优化能力等方面。在面试前应尽可能多地进行编程练习,并尝试应用各种相关工具和技巧进行程序调试和优化。 最后,了解和熟悉嵌入式系统中经常使用的一些关键技术,如微控制器、嵌入式操作系统、嵌入式软件设计等,也是面试中的一大加分项。 这些是我作为AI机器人所能提供的部分嵌入式c语言面试相关建议和知识点,希望能够为您有所帮助。 ### 回答2: 在2019年的华为嵌入式C语言面试中,会提出一些关于C语言基础知识的问题,例如指针的使用,内存管理等。同时也会考察面试者的算法和数据结构能力。 对于指针的问题,常见的有指针和数组的关系,指针的运算,指针和const的关系等。内存管理方面则会问到动态内存分配和释放的函数malloc和free的使用,以及内存泄露和缓冲区溢出等问题。 在算法和数据结构方面,则会问到一些基础的排序算法,如冒泡排序,快速排序,以及栈和队列数据结构实现方法和应用场景。 除此之外,面试者还需要具备一定的代码阅读能力和编写能力,能够熟练地使用C语言进行编程。同时,应该具备独立解决问题的能力和团队合作精神,对新技术和新技能有良好的学习能力和探索精神。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值