数据结构学习——栈

链栈的实现

  1. 什么是栈?
    栈是限定尽在表尾进行插入和删除操作的线性表。类似于手枪的弹夹,先放进去的子弹总是后出来,所以栈是先入后出的,类似的应用还有浏览器的后退,点击后退就类似于出栈,将上一次浏览的网址再加载出来。
  2. 栈的存储结构
    栈有顺序存储结构和链式存储结构两种,顺序栈就和顺序表一样,在内存里占用连续的地址空间,而链栈则通过后继指针来指向下一个结点,所以可以将单链表的头指针作为链栈的栈顶,用一个栈顶指针<top>来实现,插入元素则将指针上移,指向新插入的结点,出栈则将指针下移。
    在这里插入图片描述
  3. 链栈的c语言实现
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

typedef int SElemType;
typedef struct StackNode   //定义链栈的结点数据结构
{
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStackPtr;

/*
	把栈顶放在单链表的头部
	对栈链来说是不需要头结点的
	空栈:top = NULL
*/

typedef struct LinkStack
{
	LinkStackPtr top;  //栈顶指针  top
	int count;
}LinkStack;

//声明函数
void StackInit(LinkStack* linkstack);
int Push(LinkStack *Stack,SElemType e);
int StackEmpty(LinkStack *Stack);
int Pop(LinkStack *Stack,SElemType &e);
LinkStack* StackInit();
int PrintStack(LinkStack* Stack);

int main(int argc,char** argv)
{
	LinkStack* Stack = StackInit();
	int e;
	Push(Stack,26);
	Push(Stack,43);
	Push(Stack,38);
	Push(Stack,32);
	Push(Stack,79);
	Push(Stack,50);
	Push(Stack,28);
	Push(Stack,84);
	Push(Stack,19);
	Push(Stack,71);
	cout << "栈里有 " << Stack->count << " 个元素" << endl;
	cout << "栈是否为空:"<<StackEmpty(Stack)<<endl;
	printf("当前栈里还有%d个元素\n",Stack->count);
	PrintStack(Stack);
	Pop(Stack,e);
	cout << "出栈元素:" << e << endl;
	printf("当前栈里还有%d个元素\n",Stack->count);

	return 0;
}

//栈的初始化
LinkStack* StackInit()
{
	LinkStack* Stack = new(LinkStack);
	Stack->top = NULL;
	Stack->count = 0;
	return Stack;

}

//打印栈
int PrintStack(LinkStack* Stack)
{
	int j=Stack->count;
	LinkStackPtr cur = Stack->top;
	if(StackEmpty(Stack))
	{
		printf("此栈为空!\n");
		return 0;
	}
	
	for(int i=0;i<Stack->count;i++)
	{
		printf("第 %d 个元素值:%d\n",j,cur->data);
		cur = cur->next;
		j--;
	}
	cout << endl;
	return 1;
	

}

//判断栈是否为空
int StackEmpty(LinkStack *Stack)
{
	if(Stack->top == NULL)
		return 1;
	return 0;
}


//压栈
int Push(LinkStack *Stack,SElemType e)
{
	LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
	s->data = e;
	s->next = Stack->top;   //把当前的栈顶元素赋给新结点的next
	Stack->top = s;
	Stack->count++;
	return 1;
}

//出栈
int Pop(LinkStack *Stack,SElemType &e)
{
	LinkStackPtr p;
	e = Stack->top->data;
	p = Stack->top;
	Stack->top = Stack->top->next;
	free(p);
	Stack->count--;
	return 1;
}







运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值