【数据结构】栈及其C语言实现


请添加图片描述
图 1   数 据 结 构 − 栈 图1 ~数据结构-栈 1 

1 栈的定义与概念

定义:就是只允许在一端进行插入删除的线性表。
概念: 1 栈底 2 栈顶 3空栈
在这里插入图片描述
图 2   栈 的 表 示 图2~栈的表示 2 

2 栈的基本操作

I n i t S t a c k InitStack InitStack 初始化栈
P u s h Push Push 进栈
P o p Pop Pop 出栈
G e t T o p GetTop GetTop 获取栈顶元素
S t a c k E m p t y StackEmpty StackEmpty 判断栈是否为空
D e s t o r y S t a c k DestoryStack DestoryStack 销毁栈

3 栈的存储结构(代码实例介绍

以下顺序栈和链栈,将分别创造实例代码来讲述栈,同时通过实例来验证代码的正确性。

例 : 创 建 一 个 栈 , 元 素 1 入 栈 , 元 素 2 入 栈 , 元 素 2 出 栈 , 元 素 3 入 栈 , 元 素 4 入 栈 , 元 素 5 入 栈 , 再 清 除 栈 例:创建一个栈,元素1入栈,元素2入栈,元素2出栈,元素3入栈,元素4 入栈,元素5入栈,再清除栈 122345

代码实现此例的三个时刻

时 刻 ① : 时刻①: 初始时刻,栈内无元素,为空栈,栈长度为0;
时 刻 ② : 时刻②: 元素1入栈,元素2入栈,元素2出栈,此时栈的长度为1,出栈元素为2;
时 刻 ③ : 时刻③: 元素5入栈后,此时栈内长度为4,站内元素为 1   3   4   5 1~ 3 ~4 ~5 1 3 4 5
时 刻 ④ : 时刻④: 最后时刻,清除栈,栈内无元素,为空栈,栈长度为0.

3.1 顺序栈

#include<stdio.h>
#include<stdbool.h> 
#define MAXSIZE 5
typedef struct
{
    int data[MAXSIZE];
    int top; // 用于栈顶指针 
}SqStack;

void InitStack(SqStack *S) // 初始化一个空栈 
{
	S->top=-1;
}

// 入栈:插入元素e为新的栈顶元素 
bool Push(SqStack *S, int e)
{
	if(S->top==MAXSIZE-1) return false; // 如果栈满,则错误 
	else{
		S->top++; // 栈顶指针加1 
		S->data[S->top]=e;
		return true;
	}
}

// 出栈:删除栈顶元素并将栈顶元素赋值给e
bool Pop(SqStack *S, int *e)
{
	if(S->top==-1) return false; // 如果栈空,报错
	else{
		*e=S->data[S->top]; // 将栈顶元素赋值给e 
		S->top--; // 栈顶指针减一 
		return true;
	} 
} 

// 获得栈顶元素 
bool GetTop(SqStack *S, int *e)
{
	if(S->top==-1) return false; // 栈空则没有栈顶元素 获取失败
	else{
	    *e=S->data[S->top]; // 将栈顶元素赋值给e 
		return true; 
	} 
}

// 判断栈是否为空
bool StackEmpty(SqStack *S)
{
	if(S->top==-1) return true;
	else{
		return false;
	}
} 

// 清空栈
bool ClearStack(SqStack *S)
{ 
        S->top=-1;
        return true;
} 


// 栈中元素个数
int StackLength(SqStack *S)
{ 
        return S->top+1;
} 

// 访问栈中元素 
bool visit(int c)
{
        printf("%d ",c);
        return true;
}

// 依次输出栈中元素
bool StackTraverse(SqStack *S)
{
        int i;
        i=0;
        while(i<=S->top)
        {
                visit(S->data[i++]);
        }
        printf("\n");
        return true;
}
 
int main()
{
	SqStack S;
	InitStack(&S);  // 初始化一个空栈 
	/*时刻①*/
	printf("时刻①栈中元素:");
	StackTraverse(&S);
	printf("时刻①栈长为:%d\n", StackLength(&S));
	printf("时刻①栈是否为空:");
	if(StackEmpty(&S)==true) printf("为空\n");
	else printf("不为空\n"); 
	printf("\n");
	
	/*时刻②*/
	int j;
	for(j=1;j<=2;j++) Push(&S,j); // 元素1 2 入栈 
	int i; // i为出栈元素 应为2 
	Pop(&S, &i);
	printf("时刻②出栈元素为:%d\n", i); 
	printf("时刻②栈中元素:");
	StackTraverse(&S);
	printf("时刻②栈长为:%d\n", StackLength(&S));
	printf("时刻②栈是否为空:");
	if(StackEmpty(&S)==true) printf("为空\n");
	else printf("不为空\n"); 
	printf("\n");
	
	/*时刻③*/
	for(j=3;j<=5;j++) Push(&S,j); // 元素3,4,5 入栈 

	printf("时刻③栈中元素:");
	StackTraverse(&S);
	printf("时刻③栈长为:%d\n", StackLength(&S));
	printf("时刻③栈是否为空:");
	if(StackEmpty(&S)==true) printf("为空\n");
	else printf("不为空\n"); 
	printf("\n");
	
	/*时刻④*/
	ClearStack(&S);
	printf("时刻④栈长为:%d\n", StackLength(&S));
	printf("时刻④栈是否为空:");
	if(StackEmpty(&S)==true) printf("为空\n");
	else printf("不为空\n"); 
	printf("\n");
}

运 行 结 果 : 运行结果: 从结果来看,与例子一致。
在这里插入图片描述
图 3   顺 序 栈 运 行 结 果 图3~ 顺序栈运行结果 3 

3.2 链栈

在这里插入代码片

3.3 顺序栈和链栈的优缺点

4 栈的扩展及其应用

5 参考文献

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值