静态网站seo怎么做,上高县城乡规划建设局网站,鄂尔多斯网站制作,南京企业网站开发目录
一、栈的概念
二、栈的两种实现方式
1.顺序表实现栈
2.链表实现栈
三、栈的顺序存储结构及其实现
1.栈的声明
2.栈的初始化
3.栈的销毁
4.栈的压栈
5.栈的弹栈
6.栈的判空
7.返回栈顶元素
8.返回栈的长度
四、栈的链式存储结构及其实现
1.栈的声明
2.栈的… 目录
一、栈的概念
二、栈的两种实现方式
1.顺序表实现栈
2.链表实现栈
三、栈的顺序存储结构及其实现
1.栈的声明
2.栈的初始化
3.栈的销毁
4.栈的压栈
5.栈的弹栈
6.栈的判空
7.返回栈顶元素
8.返回栈的长度
四、栈的链式存储结构及其实现
1.栈的声明
2.栈的初始化
3.栈的销毁
4.栈的压栈
5.栈的弹栈
6.栈的判空
7.返回栈顶元素
8.返回栈的长度 一、栈的概念
栈的定义栈是一种特殊的线性表但在概念上又有一些规定栈只允许在一端进行数据的插入与删除的操作被称为栈顶而另一端则被称为栈底出栈弹栈在栈顶进行数据的删除入栈压栈在栈底进行数据的插入 LIFO原则栈中的数据服从后进先出原则last in first out 二、栈的两种实现方式
1.顺序表实现栈
设计思路将数组下标为0的位置作为栈底而数组的最大下标即长度减一作为栈顶元素可能存在的位置用top指向栈顶元素下一位置的索引压栈栈的压栈操作即为顺序表的尾插弹栈栈的弹栈操作即为顺序表的尾删设计优势避免了数组增加删除数据时候需要移动数据压栈与弹栈的时间复杂度为O(1)自身优势缓冲区的利用率高用一段连续的物理地址来存储数据缺点动态顺序表实现的栈需要扩容而扩容会导致空间浪费或性能消耗 2.链表实现栈
设计思路将单链表的尾部作为栈底将链表的头部作为栈顶链表的头指针指针栈顶元素的位置压栈栈的压栈操作即为链表的头插弹栈栈的弹栈操作即为链表的头删设计优势避免了链表删除数据结点的时候需要找到该结点的前一个结点压栈与弹栈的时间复杂度为O(1)自身优势没有扩容所带来的空间的浪费与性能的消耗缺点缓存利用率不如顺序表高 三、栈的顺序存储结构及其实现
1.栈的声明
#pragma once#includestdio.h
#includestdlib.h
#includestring.h
#includestdbool.h
#includeassert.h#define STDateType int typedef struct Stack
{STDateType* date;int top;int capacity;
}ST;void STInit(ST* st);
void STDestory(ST* st);
void STPush(ST* st, STDateType x);
void STPop(ST* st);
STDateType STTop(ST* st);
bool STEmpty(ST* st);
int STSize(ST* st);2.栈的初始化
void STInit(ST* st)
{assert(st);st-date NULL;st-capacity st-top 0;
}
3.栈的销毁
void STDestory(ST* st)
{assert(st);free(st-date);st-date NULL;st-top 0;st-capacity 0;
}
4.栈的压栈
void STPush(ST* st, STDateType x)
{assert(st);if (st-top st-capacity){size_t newcapacity (st-capacity 0 ? 4 : 2 * st-capacity);STDateType* tmp (STDateType*)realloc(st-date, sizeof(STDateType) * newcapacity);if (tmp ! NULL){st-date tmp;st-capacity newcapacity;}}st-date[st-top] x;
}
5.栈的弹栈
void STPop(ST* st)
{assert(st);assert(st-top 0);st-top--;
}
6.栈的判空
bool STEmpty(ST* st)
{assert(st);return st-top 0;
}
7.返回栈顶元素
STDateType STTop(ST* st)
{assert(st);assert(st-top 0);return st-date[st-top - 1];
}
8.返回栈的长度
int STSize(ST* st)
{assert(st);return st-top;
}
四、栈的链式存储结构及其实现
1.栈的声明
#pragma once#includestdio.h
#includestdlib.h
#includestring.h
#includestdbool.h
#includeassert.htypedef int StDateType;typedef struct StackNode
{StDateType date;struct StackNode* next;
}StackNode;typedef struct Stack
{StackNode* top;size_t size;
}Stack;void StackInit(Stack* st);//初始化
void StackDestory(Stack* st);//销毁
void StackPush(Stack* st, StDateType x);//压栈
void StackPop(Stack* st);//弹栈
StDateType StackTop(Stack* st);//读取栈顶元素
bool StackEmpty(Stack* st);//判空
size_t StackSize(Stack* st);//返回栈的长度2.栈的初始化
void StackInit(Stack* st)
{assert(st);st-top NULL;st-size 0;
}3.栈的销毁
void StackDestory(Stack* st)
{assert(st);while (st-size 0)StackPop(st);
}
4.栈的压栈
void StackPush(Stack* st, StDateType x)
{assert(st);StackNode* Node (StackNode*)malloc(sizeof(StackNode));if (!Node){perror(malloc mistake);exit(-1);}Node-date x;Node-next NULL;Node-next st-top;st-top Node;st-size;
}
5.栈的弹栈
void StackPop(Stack* st)
{assert(st);assert(st-top);StackNode* tmp st-top; st-top st-top-next; free(tmp); st-size--;
}
6.栈的判空
bool StackEmpty(Stack* st)
{assert(st);return st-top NULL;
}
7.返回栈顶元素
StDateType StackTop(Stack* st)
{assert(st);return st-top-date;
}
8.返回栈的长度
size_t StackSize(Stack* st)
{assert(st);assert(st-top);return st-size;
}