栈——数据结构——day4

栈的定义

栈是限定仅在一段进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹。
栈的删除操作,叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹。

在这里插入图片描述

栈的抽象数据类型

头文件

#ifndef __STACK_H__
#define __STACK_H__

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	struct node *pnext;
}STACK_NODE;	

typedef struct list
{
	STACK_NODE *phead;
	int clen;
}STACK_LIST;

extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern STACK_NODE *GetTopOfStack(STACK_LIST *plist);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);

#endif

栈的初始化

初始化操作,建立一个空栈

STACK_LIST *CreatStackList()
{
	STACK_LIST *p = malloc(sizeof(STACK_LIST));

	p->phead = NULL;
	p->clen = 0;

	return p;
}

销毁

若栈存在,则销毁

void DestoryStack(STACK_LIST *plist)
{
	ClearStack(plist);
	free(plist);
	return ;
}

清空

将栈清空

int ClearStack(STACK_LIST *plist)
{
	if(IsEmptyStack(plist))
	{
		return 0;
	}

	STACK_NODE *p = plist->phead;

	while(p)
	{
		PopHeadSTACK(plist,NULL);
		p = plist->phead;
	}

	return 0;
}

判断栈是否为空

int IsEmptyStack(STACK_LIST *plist)
{
	return NULL == plist->phead;
}

进栈

若栈存在,插入新元素data到栈并成为栈顶元素
在这里插入图片描述

int PushHeadSTACK(STACK_LIST *plist,int data)
{
	STACK_NODE *p = malloc(sizeof(STACK_NODE));

	p->pnext = plist->phead;
	p->data = data;

	plist->phead = p;
	plist->clen++;

	return 0;
}

出栈

删除栈顶元素,并用data返回其值
在这里插入图片描述

int PopHeadSTACK(STACK_LIST *plist,int *data)
{
	if(IsEmptyStack(plist))
	{
		return -1;
	}
	
	STACK_NODE *p = plist->phead;
	plist->phead = p->pnext;
	if(data != NULL)
	{
		*data = p->data;
	}
		free(p);
	plist->clen--;

	return 0;
}

获取栈顶元素

若栈存在且为空,返回栈顶并获取其指针

STACK_NODE *GetTopOfStack(STACK_LIST *plist)
{
	if(IsEmptyStack(plist))
	{
		return NULL;
	}
	
	STACK_NODE *p = plist->phead;

	return p;
}

栈的长度

返回栈的元素个数

int StackLength(STACK_LIST *plist)
{
	return plist->clen;
}

遍历栈

int ErgodicOfStack(STACK_LIST *plist)
{
	if(IsEmptyStack(plist))
	{
		return 0;
	}
	
	STACK_NODE *p = plist->phead;

	while(p)
	{
		printf("%d ",p->data);
		p = p->pnext;
	}
	
	putchar('\n');

	return 0;
}

栈的应用

四则运算表达式求值

头文件

#ifndef __STACK_H__
#define __STACK_H__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


typedef struct node
{
	int data;
	struct node *pnext;
}STACK_NODE;

typedef struct list
{
	STACK_NODE *phead;
	int clen;
}STACK_LIST;

extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern int GetTopOfStack(STACK_LIST *plist,int *num);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);
extern int IsEmptyStack(STACK_LIST *plist);

#endif

main.c

#include "stack.h"

int IsNumChar(char ch)
{
	if(ch >= '0' && ch <= '9')
	{
		return 1;
	}
	return 0;
}

int GetOptLevel(char opt)
{
	switch(opt)
	{
		case '+':
		case '-':
			return 1;
		case '*':
		case '/':
			return 2;
		default:
			printf("opt error\n");
			exit(1);
	}
}

int GetValue(int num1,int num2,int opt)
{
	switch(opt)
	{
	case '+':
		return num1 + num2;
	case '-':
		return num1 - num2;
	case '*':
		return num1 * num2;
	case '/':
		return num1 / num2;
	}
}

int main(void)
{
	char str[1024] = {0};
	
	STACK_LIST *pstacknum = CreatStackList();
	STACK_LIST *pstackopt = CreatStackList();
	if(NULL == pstacknum || NULL == pstackopt)
	{
		return -1;
	}


	printf("Please enter four operations:");
	fgets(str,sizeof(str),stdin);
	str[strlen(str)-1] = '\0';

	char *p = str;
	int num = 0;
	int popOpt;
	int num1,num2,opt;

	while(1)
	{
		if(*p == '\0' && IsEmptyStack(pstackopt))
		{
			break;
		}

		while(IsNumChar(*p))
		{
			num = num * 10 + (*p - '0') ;
			p++;
			if(!IsNumChar(*p))
			{
				PushHeadSTACK(pstacknum,num);
				num = 0;
			}
		}
		

		if(IsEmptyStack(pstackopt))
		{
			PushHeadSTACK(pstackopt,*p);
			p++;
			continue;
		}
		
		GetTopOfStack(pstackopt,&popOpt);
		if(*p != '\0' && GetOptLevel(*p) > GetOptLevel(popOpt))
		{
			PushHeadSTACK(pstackopt,*p);
			p++;
		}
		else
		{
			PopHeadSTACK(pstackopt,&opt);
			PopHeadSTACK(pstacknum,&num2);
			PopHeadSTACK(pstacknum,&num1);
			int res = GetValue(num1,num2,opt);
			PushHeadSTACK(pstacknum,res);
		}

	}
	
	ErgodicOfStack(pstacknum);

	DestoryStack(pstacknum);
	DestoryStack(pstackopt);

	return 0;
}

opera.c

#include "stack.h"

STACK_LIST *CreatStackList()
{
	STACK_LIST *p = malloc(sizeof(STACK_LIST));

	p->phead = NULL;
	p->clen = 0;

	return p;
}

int IsEmptyStack(STACK_LIST *plist)
{
	return NULL == plist->phead;
}

int PushHeadSTACK(STACK_LIST *plist,int data)
{
	STACK_NODE *p = malloc(sizeof(STACK_NODE));


	p->pnext = plist->phead;
	p->data = data;

	plist->phead = p;
	plist->clen++;

	return 0;
}

int PopHeadSTACK(STACK_LIST *plist,int *data)
{
	if(IsEmptyStack(plist))
	{
		return -1;
	}
	
	STACK_NODE *p = plist->phead;
	plist->phead = p->pnext;
	if(data != NULL)
	{
		*data = p->data;
	}
		free(p);
	plist->clen--;

	return 0;
}

int GetTopOfStack(STACK_LIST *plist,int *num)
{
	if(IsEmptyStack(plist))
	{
		return 0;
	}
	
	STACK_NODE *p = plist->phead;

	*num = p->data;

	return 0;
}

int ClearStack(STACK_LIST *plist)
{
	if(IsEmptyStack(plist))
	{
		return 0;
	}

	STACK_NODE *p = plist->phead;

	while(p)
	{
		PopHeadSTACK(plist,NULL);
		p = plist->phead;
	}

	return 0;
}

void DestoryStack(STACK_LIST *plist)
{
	ClearStack(plist);
		free(plist);
		return ;
}

int StackLength(STACK_LIST *plist)
{
	return plist->clen;
}

int ErgodicOfStack(STACK_LIST *plist)
{
	if(IsEmptyStack(plist))
	{
		return 0;
	}
	
	STACK_NODE *p = plist->phead;

	while(p)
	{
		printf("%d ",p->data);
		p = p->pnext;
	}
	
	putchar('\n');

	return 0;
}

###结果:
在这里插入图片描述
以上就是今天内容!

相关推荐

  1. 数据结构DAY3--与队列

    2024-03-23 03:28:03       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-23 03:28:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-23 03:28:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-23 03:28:03       87 阅读
  4. Python语言-面向对象

    2024-03-23 03:28:03       96 阅读

热门阅读

  1. Unix环境高级编程-学习-07-多线程之互斥锁

    2024-03-23 03:28:03       35 阅读
  2. Springboot vue elementui 停车场管理系统

    2024-03-23 03:28:03       38 阅读
  3. 383. 赎金信

    2024-03-23 03:28:03       44 阅读
  4. Python——删除加密excel文件的密码

    2024-03-23 03:28:03       46 阅读
  5. 双亲委派模型

    2024-03-23 03:28:03       48 阅读
  6. LeetCode——二分查找

    2024-03-23 03:28:03       42 阅读
  7. 【Docker】Airflow Worker 容器部署

    2024-03-23 03:28:03       37 阅读
  8. 爬虫第3课:二手车搜索

    2024-03-23 03:28:03       46 阅读