笔试c语言实现栈,栈的实现与操作(C语言实现)

栈的定义

1, 栈是一种特殊的线性表

2,栈仅能在线性表的一端进行操作

3,栈顶(Top): 允许操作的一端 允许操作的一端

4,栈底(Bottom): ,不允许操作的一端 不允许操作的一端

这里我做出了 栈的顺序实现 和 链式实现,分别如下:

=========================================华丽丽的分割线==========================================================

栈的顺序实现:

首先,我们要弄明白的是,栈本质上就是线性表,是一种特殊的线性表,只是只能在一端进行操作罢了,故而很多操作线性表是很类似的。因此,我们可以将之前写的

顺序线性表的实现及操作(C语言实现)

中的代码直接拿过来使用,以达到代码复用的效果(代码就不在此处追述了)。

头文件:

#ifndef _SEQSTACK_H_

#define _SEQSTACK_H_

typedef void SeqStack;

SeqStack* SeqStack_Create(int capacity);

void SeqStack_Destroy(SeqStack* stack);

void SeqStack_Clear(SeqStack* stack);

int SeqStack_Push(SeqStack* stack, void* item);

void* SeqStack_Pop(SeqStack* stack);

void* SeqStack_Top(SeqStack* stack);

int SeqStack_Size(SeqStack* stack);

int SeqStack_Capacity(SeqStack* stack);

#endif

源文件: // 栈.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include "SeqStack.h"

#include "SeqList.h"

int _tmain(int argc, _TCHAR* argv[])

{

SeqStack* stack = SeqStack_Create(20);

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

SeqStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)SeqStack_Top(stack));

printf("Capacity: %d\n", SeqStack_Capacity(stack));

printf("Length: %d\n", SeqStack_Size(stack));

while( SeqStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));

}

SeqStack_Destroy(stack);

system("pause");

return 0;

}

//创建栈

SeqStack* SeqStack_Create(int capacity)

{

return SeqList_Create(capacity);

}

//销毁

void SeqStack_Destroy(SeqStack* stack)

{

SeqList_Destroy(stack);

}

//清空

void SeqStack_Clear(SeqStack* stack)

{

SeqList_Clear(stack);

}

//压栈

int SeqStack_Push(SeqStack* stack, void* item)

{

return SeqList_Insert(stack, item, SeqList_Length(stack));

}

//弹栈

void* SeqStack_Pop(SeqStack* stack)

{

return SeqList_Delete(stack, SeqList_Length(stack) - 1);

}

//获得栈顶

void* SeqStack_Top(SeqStack* stack)

{

return SeqList_Get(stack, SeqList_Length(stack) - 1);

}

//栈的大小

int SeqStack_Size(SeqStack* stack)

{

return SeqList_Length(stack);

}

//顺序栈的总大小

int SeqStack_Capacity(SeqStack* stack)

{

return SeqList_Capacity(stack);

}

运行结果: Top: 9

Capacity: 20

Length: 10

Pop: 9

Pop: 8

Pop: 7

Pop: 6

Pop: 5

Pop: 4

Pop: 3

Pop: 2

Pop: 1

Pop: 0

请按任意键继续. . .

=====================================我是分割线========================================================

栈的链式实现:

同栈的顺序实现一样,栈的链式实现本质上其实就是单链表的形式,也只是在一头操作罢了,因此我们这里亦采用代码复用的方法,具体代码请参阅:

头文件:

#ifndef _LINKSTACK_H_

#define _LINKSTACK_H_

typedef void LinkStack;

LinkStack* LinkStack_Create();

void LinkStack_Destroy(LinkStack* stack);

void LinkStack_Clear(LinkStack* stack);

int LinkStack_Push(LinkStack* stack, void* item);

void* LinkStack_Pop(LinkStack* stack);

void* LinkStack_Top(LinkStack* stack);

int LinkStack_Size(LinkStack* stack);

#endif

源文件: #include "stdafx.h"

#include "LinkList.h"

#include "LinkStack.h"

#include

#include

int main(int argc, char *argv[])

{

LinkStack* stack = LinkStack_Create();

int a[10];

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i;

LinkStack_Push(stack, a + i);

}

printf("Top: %d\n", *(int*)LinkStack_Top(stack));

printf("Length: %d\n", LinkStack_Size(stack));

while( LinkStack_Size(stack) > 0 )

{

printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));

}

LinkStack_Destroy(stack);

system("pause");

return 0;

}

typedef struct _tag_LinkStackNode

{

LinkListNode header;

void* item;

} TLinkStackNode;

//创建

LinkStack* LinkStack_Create()

{

return LinkList_Create();

}

//销毁

void LinkStack_Destroy(LinkStack* stack)

{

LinkStack_Clear(stack);

LinkList_Destroy(stack);

}

//清空

void LinkStack_Clear(LinkStack* stack)

{

while( LinkStack_Size(stack) > 0 )

{

LinkStack_Pop(stack);

}

}

//压栈

int LinkStack_Push(LinkStack* stack, void* item)

{

TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));

int ret = (node != NULL) && (item != NULL);

if( ret )

{

node->item = item;

ret = LinkList_Insert(stack, (LinkListNode*)node, 0);

}

if( !ret )

{

free(node);

}

return ret;

}

//出栈

void* LinkStack_Pop(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

free(node);

}

return ret;

}

//获得栈顶

void* LinkStack_Top(LinkStack* stack)

{

TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

}

return ret;

}

//获得栈的大小

int LinkStack_Size(LinkStack* stack)

{

return LinkList_Length(stack);

}

运行结果:

Top: 9

Length: 10

Pop: 9

Pop: 8

Pop: 7

Pop: 6

Pop: 5

Pop: 4

Pop: 3

Pop: 2

Pop: 1

Pop: 0

请按任意键继续. . .

如有错误,望不吝指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值