对与数据结构的一些自己的想法1.1关于栈
2019-07-13 20:43 Maoey 阅读(146) 评论(0) 收藏 举报我在学习数据结构时,并没有先接触系统中自带的函数而是从自己想他是如何实现的并且用自己的话表达出来。
因为是跟课所以最开始就只是跟着打代码,不过在打的过程中也了解到数据结构对我们的帮助。
首先从数据结构中较为简单的线性表开始,他的关系是一对一的,包含了栈,链表,队列等。
栈的存储方式比较特别是先进后出,因为这种方式只有一个入口,且入口和出口是同一个。
比如我们要放入10个连续有序数
12345678910
我们的出栈序列就有很多种不同的方法
有个题目是问给一个入栈序列和一个出栈序列,问判断出栈序列是否正确
因为我实现了栈的基本功能所以通过栈的顶部元素是否等于出栈的元素如果是则出栈不是则继续入栈,最后判断是否栈空,是则是,不是则不是。
include<stdio.h>
include<stdlib.h>
include<stdbool.h>
define TYPE int
typedef struct Stack
{
TYPE *arr;//内存首地址
int len;//栈的容量 typedef unsigned int size_t
int top;//栈顶下标
}Stack;
//判断
bool is_pop(int* in ,int* out,size_t len);
//创建
Stack* creat_stack(size_t cal);
//销毁
void destory_stack_(Stack* stack);
//入栈
bool push_stack(Stack* stacl,TYPE data);
//出栈
bool pop_stack(Stack* stack);
//判断栈空
bool empty_stack(Stack* stack);
//栈满
bool full_stack(Stack* stack);
//查看栈顶
TYPE* top_stack(Stack* stack);
int main()
{
;
}
//创建
Stack* creat_stack(size_t cal)
{
Stack* stack=malloc(sizeof(Stack));
stack->arr=malloc(sizeof(TYPE)cal);
stack->len=cal;
stack->top=-1;
return stack;
}
//销毁
void destory_stack_(Stack stack)
{
free(stack->arr);
free(stack);
}
bool is_pop(int* in ,int* out,size_t len)
{
//创建栈
Stack* stack=creat_stack(len);
for(int i=0,j=0;i<len;i++)
{
push_stack(stack,in[i]);
while(j<len&& *top_stack(stack)==out[j])
{
pop_stack(stack);
j++;
}
}
return empty_stack(stack);
}
//入栈
bool push_stack(Stack* stack,TYPE data)
{
if(full_stack(stack))
{
return false;
}
stack->arr[++stack->top]=data;
return true;
}
//出栈
bool pop_stack(Stack* stack)
{
if(empty_stack(stack))
{
return false;
}
stack->top--;
return true;
}
//判断栈空
bool empty_stack(Stack* stack)
{
return -1==stack->top;
}
//栈满
bool full_stack(Stack* stack)
{
return stack->top>=stack->len-1;
}
//查看栈顶
TYPE* top_stack(Stack* stack)
{
if(empty_stack(stack)) return NULL;
return stack->arr+stack->top;
}
以上是用自己的想法来实现哟个栈的基本功能,所以里面会有所不足。其中is_pop(int* in,int* out,size_t len)因为两个序列不相同的话肯定不是其出栈序列所以我这里只判断序列相等。int main函数中只需要提供两个序列和序列的长度即可判断。
还有比较常见的问题是两个栈封装为一个队列
这里我们介绍一下队列,队列较栈,他有两个口,一个入口,一个出口,满足先进先出的规则

这里我们用第一个栈的入栈来模拟入队,用第二个栈的出栈来模拟出队,顺序为全入第一个栈后再有第一个栈全部弹入第二栈,再由第二个栈弹出模拟出队,但这里有一个问题是如果再第个二栈不为空时则不符合先进先出的规则。
所以我们设定第二个栈出完第一个栈才有可能弹入。这样就可以完成两个栈组成一个队列的功能了。
浙公网安备 33010602011771号