当前位置:网站首页>(8)顺序栈和链栈
(8)顺序栈和链栈
2022-06-22 07:49:00 【Day-3】
顺序栈
顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设有指针top指示栈顶元素在顺序栈中的位置;另设指针base指示栈底元素在顺序栈中的位置。当top和base的值相等时,表示空栈。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20
typedef struct {
int nData[MAXSIZE];
int nTop;
}RkStack;
//初始化栈
bool InitStack(RkStack * Stack)
{
Stack->nTop = -1;
return true;
}
//清理栈
bool ClearStack(RkStack * Stack)
{
Stack->nTop = -1;
return true;
}
// 判断栈是否为空
bool StackEmpty(RkStack Stack)
{
if (Stack.nTop == -1)
{
return true;
}
else
{
return false;
}
}
//或取栈的长度
int StackLength(RkStack Stack)
{
return Stack.nTop + 1;
}
//栈顶
int GetTop(RkStack Stack, int * nData)
{
if (Stack.nTop == -1)
{
return false;
}
else
{
*nData = Stack.nData[Stack.nTop];
}
}
//push
bool push(RkStack * Stack, int nData)
{
if (Stack->nTop == MAXSIZE - 1)
{
return false;
}
else
{
Stack->nTop++;
Stack->nData[Stack->nTop] = nData;
return true;
}
}
//pop
bool pop(RkStack * Stack, int *nData)
{
if (Stack->nTop == -1)
{
return false;
}
else
{
*nData = Stack->nData[Stack->nTop];
Stack->nTop--;
return true;
}
}
//打印数据
bool ShowStack(RkStack Stack)
{
if (Stack.nTop == -1)
{
return false;
}
for (size_t i = 0; i < Stack.nTop; i++)
{
printf("Stack value = %d\n", Stack.nData[i]);
}
return true;
}
int main()
{
RkStack rkStack;
InitStack(&rkStack);
for (size_t i = 0; i < 10; i++)
{
push(&rkStack, i);
}
ShowStack(rkStack);
int nData = 0;
pop(&rkStack, &nData);
printf("pop value = %d\n", nData);
//ShowStack(rkStack);
GetTop(rkStack, &nData);
printf("GetTop = %d\n", nData);
int Size = StackLength(rkStack);
printf("StackLength = %d\n", Size);
ClearStack(&rkStack);
bool nFlag = StackEmpty(rkStack);
if (nFlag)
{
printf("Empty\n");
}
system("pause");
return 0;
}
链栈
链栈是指采用链式存储结构实现的栈,通常链栈用单链表表示。
没有特殊要求,顺序栈比链栈更实用。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct _StackNode
{
int nData;
struct _StackNode *next;
}StackNode,*PStackNdoe;
typedef struct RkStack {
PStackNdoe top;
int count;
};
//初始化栈
bool InitStack(struct RkStack * Stack)
{
Stack->top = (PStackNdoe)malloc(sizeof(StackNode));
if (!Stack->top)
{
return false;
}
Stack->top = NULL;
Stack->count = 0;
return true;
}
//清理栈
bool ClearStack(struct RkStack * Stack)
{
PStackNdoe TempNode1;
PStackNdoe TempNode2;
TempNode1 = Stack->top;
while (TempNode1)
{
TempNode2 = TempNode1;
TempNode1 = TempNode1->next;
free(TempNode2);
}
Stack->count = 0;
}
// 判断栈是否为空
bool StackEmpty(struct RkStack Stack)
{
if (Stack.count == 0)
{
return true;
}
else
{
return false;
}
}
//或取栈的长度
int StackLength(struct RkStack Stack)
{
return Stack.count;
}
//栈顶
int GetTop(struct RkStack Stack, int * nData)
{
if (Stack.top == NULL)
{
return false;
}
else
{
*nData = Stack.top->nData;
return true;
}
}
//push
bool push(struct RkStack * Stack, int nData)
{
PStackNdoe mStackNode = (PStackNdoe)malloc(sizeof(StackNode));
mStackNode->nData = nData;
mStackNode->next = Stack->top;
Stack->top = mStackNode;
Stack->count++;
return true;
}
//pop
bool pop(struct RkStack * Stack, int *nData)
{
PStackNdoe mStackNode;
if (StackEmpty(*Stack))
{
return false;
}
else
{
*nData = Stack->top->nData;
mStackNode = Stack->top;
Stack->top = Stack->top->next;
free(mStackNode);
Stack->count--;
return true;
}
}
//打印数据
bool ShowStack(struct RkStack Stack)
{
PStackNdoe mStackNode;
mStackNode = Stack.top;
while (mStackNode)
{
printf("value = %d\n", mStackNode->nData);
mStackNode = mStackNode->next;
}
return true;
}
int main()
{
struct RkStack rkStack;
int nData;
InitStack(&rkStack);
for (size_t i = 0; i < 10; i++)
{
push(&rkStack, i);
}
ShowStack(rkStack);
pop(&rkStack, &nData);
printf("pop value = %d\n", nData);
ShowStack(rkStack);
GetTop(rkStack, &nData);
printf("Get top value = %d\n", nData);
ClearStack(&rkStack);
if (StackEmpty(rkStack))
{
printf("Empty!\n");
}
system("pause");
return 0;
}
区别
顺序栈和链栈区别如下:
- 存储结构不同,顺序栈是静态分配的,而链栈则是动态分配的,链栈可以将很多零碎的空间利用起来,容量可变,节省空间,顺序栈则固定内存空间,容量不变。
- 使用方面,顺序栈查询速度快,链栈添加删除数据更快。
边栏推荐
- Vue page caching problem solving (keep alive + page level routing guard + lifecycle activated)
- Wechat games (3)
- 9、 Textinput component
- Usage and understanding of async/await in JS
- Solve syntaxerror: cannot use import statement outside a module
- Layer drawing method
- Win openfeign from simple to deep
- 网站如何提高百度权重
- CollectionViewCell
- An example shows the difference between let and VaR
猜你喜欢

Open version - order delivery

充电宝的玄机

Xmind 2022思维导图激活版资源?

Multimedia architecture -- Introduction to display

Does it matter if you delete the pictures in the picture space after uploading to the store

Win openfeign from simple to deep

Open source get through version - integral function

Remote Desktop Manager

Vue page caching problem solving (keep alive + page level routing guard + lifecycle activated)

Wechat games (4)
随机推荐
Runloop detail summary
Vue failed to connect to MySQL database
Unity AssetBundle packaging
mysql截取字符串CS0000_1中_后面的字符
[common template problems in graph theory] four shortest path solutions and two minimum spanning tree solutions
Relative positioning, absolute positioning, fixed positioning
模板代码概述
ASP. Net core development experience
丰田bZ4X取消上市发布会,就算低温充电问题不存在,产品力如何?
Some problems caused by null data in MySQL
Reasons and solutions for Taobao's baby's prompt "sales attribute is required and parameter format is wrong"
【宋红康 MySQL数据库 】【高级篇】【07】MySQL的存储引擎
代码覆盖率测试对编程小白的意义及其使用方法
Detailed explanation of subnet mask
Open source open source version - pintuan
4、 Button component
Open version - inventory description
Wx applet vant UI call interface to realize two-level cascade
网站是否要修改标题
5、 Image component