数据结构-栈

1  栈的定义

    栈是一种“先进后出”的数据结构,有压栈、出栈两种操作方式,栈顶允许操作,栈底不允许操作,如图1所示,

                                         图1

栈的基本操作包括创建栈,销毁栈,出栈,入栈,获取栈顶元素,获取栈的大小,清空栈。

2   栈的分类

栈主要分为两类:静态栈与动态栈

静态栈:静态栈的核心是数组,类似于一个连续内存的数组,我们只能操作栈顶元素。

动态栈:动态栈的核心是链表,我们也只能操作栈顶元素。

3   栈的算法

栈的算法主要是压栈和出栈两种操作算法:

(1)栈操作的是一个一个节点;

(2)栈本身也是一一种存储的数据结构;

(3)栈有初始化、销毁、出栈、入栈、判空、遍历等方法

4    栈的方法

4.1   栈的初始化

typedef struct LinkList
{
	int val;
	LinkList *next;
};
typedef struct LinkStack
{
	int len;
	LinkList *top;
	LinkList *bot;
};
//创建栈
LinkStack*creat_LinkStack()
{
	LinkStack *p = (LinkStack*)malloc(sizeof(LinkStack));//栈的初始化
	p->top=p->bot = (LinkList*)malloc(sizeof(LinkList));//栈顶与栈底为同一位置
	if (p->top == NULL) return NULL;//判断是否还有内存
	p->top->next= NULL;//只有一个链表结构
	return p;
	
}

.4.2   栈的判空

//判断是否为空
bool is_Empty(LinkStack*p)
{
	if (p->top == p->bot) return true;
	else
	{
		return false;
	}
}

4.3  入栈

//入栈
int push_LinkStack(LinkStack*s, int x)
{
	LinkList *Node = (LinkList*)malloc(sizeof(LinkList));
	Node->val = x;
	Node->next =NULL;
	Node->next = s->top;//先将以前的链表与push的进行连接
	s->top = Node;//栈顶指向push进去的链表
	return 1;

}

4.4  出栈

//出栈
int pop_LinkStack(LinkStack*s)
{	
	if (is_Empty(s))
	{
		printf("该栈为空栈");
		return 0;
	}
	LinkList *del = s->top;
	s->top = s->top->next;
	int ret = del->val;
	free(del);
	del = NULL;
	return ret;
}

4.5  清空栈

//清空栈
int clear_LinkStack(LinkStack*p)
{
	if (is_Empty(p)) { return 1; }
	LinkList *Node = p->top;
	while (Node!=p->bot)
	{
		p->top = p->top->next;
		free(Node);
		//Node = NULL;
		Node = p->top;
	}
	p->top=p->bot;
	return 1;
}

4.6  遍历栈

//遍历,打印栈
void traverse(LinkStack*s)
{
	if(is_Empty(s))
	{
		printf("为空栈");
		printf("\n");
	}
	int count = 0;
	LinkList*Node = s->top;
	while (Node!=s->bot)
	{
		count += 1;
		printf("第%d个值为%d", count, Node->val);
		Node = Node->next;
		printf("\n");
	}
}

4.7  主程序

int main()
{
	LinkStack*s;
	s=creat_LinkStack();
	push_LinkStack(s, 1);
	push_LinkStack(s, 2);
	push_LinkStack(s, 3);
	traverse(s);
	//pop
	pop_LinkStack(s);
	//遍历栈
	traverse(s);
	//清空
	clear_LinkStack(s);
	traverse(s);
	system("pause");
	converse();
	bracket_matching();
	system("pause");
}

5  栈的案例

5.1  将一个十进制转为8进制输出

void converse()
{
	LinkStack*s;
	int N;
	s = creat_LinkStack();
	//输入10进制数
	printf("请输入一个十进制数");
	scanf_s("%d", &N);
	while (N)
	{
		push_LinkStack(s, N % 8);
		N = N /8;
	}
	//输出八进制数
	printf("八进制数为:\n");
	while (!is_Empty(s))
	{		
		printf("%d", pop_LinkStack(s));
	}
	printf("\n");
	
}

5.2  匹配括号的检验

//匹配括号的检验
void bracket_matching()
{
	LinkStack *s = creat_LinkStack();
	int N;
	printf("清输入对应的括号\n");
	scanf_s("%d", &N);
	if (is_Empty(s))
	{
		push_LinkStack(s, N);
	}
	while (!is_Empty(s))
	{
		int M;
		printf("清输入对应的括号\n");
		scanf_s("%d", &M);
		if (M == 0) break;
		if (s->top->val == M)
		{
			printf("匹配成功\n"); pop_LinkStack(s); traverse(s);
		}
		else
		{
			printf("未消除\n");
			push_LinkStack(s, M);
		}
	}
}

参考博客:https://www.cnblogs.com/xiaoyouPrince/p/8082640.html

http://blog.51cto.com/9291927/2063393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值