数据结构之逆波兰表达式的用法

12 篇文章 0 订阅
10 篇文章 0 订阅
//逆波兰表达式:将中缀表达式转换为后缀表达式

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

#define STACK_INIT_SIZE 20
#define STACKINCREAMENT 10

typedef char ElemType;

//栈结构
typedef struct {
	ElemType* base;
	ElemType* top;
	int stackSize;
}sqStack;


//栈的初始化
void InitStack(sqStack* s) {
	s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if (!s->base)
		exit(0);
	s->top = s->base;
	s->stackSize = STACK_INIT_SIZE;
}


//压栈操作
void Push(sqStack* s, ElemType n) {
	if (s->top - s->base >= s->stackSize)
	{
		s->base = realloc(s->base, ((s->stackSize + STACKINCREAMENT) * sizeof(ElemType)));
	}
	if (!s->base)
		exit(0);
	*s->top = n;
	s->top++;
}


//弹栈操作
void Pop(sqStack* s, ElemType* n) {
	if (!s->base)
		exit(0);
	if (s->top == s->base)
		return;
	*n = *--(s->top);
}

//求栈当前容量
int StackLen(sqStack s) {

	return (s.top - s.base);
}

//主入口
int main(void) {
	sqStack s;
	char c, e;
	InitStack(&s);
	printf("请输入中缀表达式,以#作为结束标志:");
	scanf("%c", &c);
	while (c != '#') {
		while(c >= '0' && c <= '9') {
			printf("%c", c);
			scanf("%c", &c);
			if (c < '0' || c>'9')
				printf(" ");
		}
		if (')' == c) {
			Pop(&s, &e);
			while (e != '(') {
				printf("%c ", e);
				Pop(&s, &e);
			}
		}
		else if (c == '+' || c == '-') {
			if (!StackLen(s)) {
				Push(&s, c);
			}
			else {
				do {
					Pop(&s, &e);
					if ('(' == e) {
						Push(&s, e);
					}
					else
						printf("%c ", e);
				} while (StackLen(s) && e != '(');
				Push(&s, c);
			}
		}
		else if (c == '*' || c == '/' || c == '(') {
			Push(&s, c);
			if (!StackLen(s)) {
				Push(&s, c);
			}
		}
		else if (c == '#')
			break;
		else 
        {
		printf("输入有误!");
		return -1;
		}
		scanf("%c", &c);
				}
while (StackLen(s)) {
	Pop(&s, &e);
	printf("%c ", e);
}
     return 0;
}
	

小白的数据结构自学笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值