栈的应用

编译环境vs2008
Stack.h
#pragma once 

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

//typedef int DataType;  //基本操作使用
//typedef char DataType;   //括号匹配问题使用
typedef int DataType;     //逆波兰表达式使用
#define MAX_SIZE 10

typedef struct Stack
{
	DataType _array[MAX_SIZE];
	int _size;
}Stack;

//栈的初始化
void StackInit(Stack* s);

//入栈操作
void StackPush(Stack* s,DataType data);

//出栈
void StackPop(Stack* s);

//获取栈顶元素
DataType StackTop(Stack* s);

//获取栈内元素的个数
int StackSize(Stack* s);

//判断栈是否为空
int StackEmpty(Stack* s);



//判断括号是否匹配
int MatchBrackets(const char* pStr);





//以下的三个都是逆波兰表达式范畴

//创建一个枚举类型
typedef enum{ADD,SUB,MUL,DIV,DATA}OPERATOR;

//创建一个结构体
typedef struct Cell
{
	OPERATOR _op;
	int _data;
}Cell;

//逆波兰表达式
int CalaRPN(Cell * RPN, int size);

Stack.c
#include "Stack.h"

//栈的初始化
void StackInit(Stack* s)
{
	assert(s);
	s->_size = 0;
}

//入栈操作
void StackPush(Stack* s,DataType data)
{
	assert(s);
	if(s->_size == MAX_SIZE)
		return;
	s->_array[s->_size++] = data;
}

//出栈
void StackPop(Stack* s)
{
	assert(&s);
	if(StackEmpty(s))
		return;
	s->_size--;
}

//获取栈顶元素
DataType StackTop(Stack* s)
{
	assert(s);
	return s->_array[s->_size-1];
}

//获取栈内元素的个数
int StackSize(Stack* s)
{
	assert(s);
	return s->_size;
}

//判断栈是否为空
int StackEmpty(Stack* s)
{
	assert(s);
	return 0 == s->_size;
}

//判断字符是否是括号
int IsBracket(char ch)
{
	if('(' == ch || ')' == ch ||
		'[' == ch  || ']' == ch ||
		'{' == ch || '}'== ch)
	{
		return 1;
	}
	return 0;
}

//判断括号是否匹配
int MatchBrackets(const char* pStr)
{
	int i = 0;
	int size = strlen(pStr);
	Stack s;
	StackInit(&s);
	for(; i<size; ++i)
	{
		if(!IsBracket(pStr[i]))
		continue;
		else
		{
			//当前字符为括号
			//当前字符为左括号
			if('(' == pStr[i] || '[' == pStr[i] || '{' == pStr[i])
				StackPush(&s,pStr[i]);
			else
			{
				char ch;
				//当前字符为右括号
				if(StackEmpty(&s))
				{
					printf("右括号比左括号多\n");
					return 0;
				}

				ch = StackTop(&s);
				if(ch == '(' && pStr[i] == ')' ||
					ch == '[' && pStr[i] == ']' ||
					ch == '{' && pStr[i] == '}')
				{
					StackPop(&s);
				}
				else
				{
					printf("左右括号的次序匹配出错!!!\n");
					return 0;
				}
			}
		}	
	}
	if(!StackEmpty(&s))
	{
		printf("左括号比右括号多!!!\n");
		return 0;
	}

	printf("左右括号匹配正确!!!\n");
	return 1;
}


int CalaRPN(Cell * RPN, int size)
{
	int i = 0;
	Stack s;
	StackInit(&s);
	for(; i<size; ++i)
	{
		if(RPN[i]._op ==  DATA)
			StackPush(&s,RPN[i]._data);
		else
		{
			int left = 0,right = 0;
			right = StackTop(&s);
			StackPop(&s);
			left = StackTop(&s);
			StackPop(&s);

			switch(RPN[i]._op)
			{
			case ADD:
				StackPush(&s,left+right);
				break;
			case SUB:
				StackPush(&s,left- right);
				break;
			case MUL:
				StackPush(&s,left*right);
				break;
			case DIV:
				if(0 == right)
				{
					printf("除法的右操作数为0非法!!!\n");
					return 0;
				}
				StackPush(&s,left/right);
				break;
			default:
				printf("无法进行操作!!!\n");
				return 0;
			}
		}
	}
	return StackTop(&s);
}

test.c

#include "Stack.h"

//栈的基本操作
void StackTest();

//括号匹配
void test();

//逆波兰表达式
void test1();

int main()
{
	//StackTest();
	//test();
	test1();
	return 0;
}

//栈的基本操作
void StackTest()
{
	Stack s;
	StackInit(&s);
	StackPush(&s,2);
	StackPush(&s,3);
	StackPush(&s,4);
	StackPush(&s,5);
	printf("栈内一共有%d个元素\n",StackSize(&s));
	printf("栈顶元素是%d\n",StackTop(&s));
	printf("%d\n",StackEmpty(&s));
	StackPop(&s);
	StackPop(&s);
	printf("栈内一共有%d个元素\n",StackSize(&s));
	printf("栈顶元素是%d\n",StackTop(&s));
	printf("%d\n",StackEmpty(&s));
}

//括号是否匹配
void test()
{
	//char * str = "(())abc{[(])}";
	//char a[] = "(()))abc{[]}";
	char b[] = "(()()abc{[]}";
	char c[] = "(())abc{[]()}";
	MatchBrackets(c);
}

//逆波兰表达式
void  test1()
{
	Cell RPN[] = {{DATA,12},{DATA,3},{DATA,4},{ADD,0},
	{MUL,0},{DATA,6},{SUB,0},{DATA,8},{DATA,2},{DIV,0},
	{ADD,0}};

	printf("%d\n",CalaRPN(RPN,sizeof(RPN)/sizeof(RPN[0])));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LIN协议是一种用于低成本、低速率串行网络的通信协议,主要应用于车辆电子系统。以下是关于LIN协议应用的一些分享。 首先,LIN协议在车辆电子系统常用于连接各种低速率从设备,如门控制单元、窗户控制单元、座椅控制单元等。通过LIN总线,这些从设备可以与车辆主控制单元进行通信和控制。相比于其他高速率通信协议,如CAN协议,LIN协议更适用于这些低速率从设备的通信需求。 其次,LIN协议具有较低的成本优势。由于LIN协议使用的是普通的串行通信线路,不需要专用的硬件设备支持,因此整体成本相对较低。这使得LIN协议在汽车电子系统得到广泛的应用,特别是在非关键性应用。 此外,LIN协议还具有较低的功耗。由于LIN协议使用的是低速率通信,通信过程的能耗相对较低。这在需要长时间运行的系统尤为重要,例如关闭引擎后仍需要继续运行的车辆电子系统。 最后,LIN协议还支持多主从架构。这意味着在LIN总线上可以连接多个主设备和从设备,实现复杂的通信和控制功能。这种灵活性使得LIN协议在车辆电子系统能够满足不同设备之间的通信需求。 总之,LIN协议在车辆电子系统应用广泛,并且具有成本低、功耗低和多主从支持等优势。随着车辆电子化的发展,LIN协议在汽车行业应用前景将会更加广阔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值