IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 100 Days of Code-day29(逆波兰,your bro is coming) -> 正文阅读

[C++知识库]100 Days of Code-day29(逆波兰,your bro is coming)

编写程序 expr,它从命令行计算逆波兰表达式,其中每个运算符或操作数是一个单独的参数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

#define MaxOp 100
#define number '0'
#define MaxRowNum 100

char getop(char *);
void push(double);
double pop(void);
double myatof(char *);

int main()
{
	int argc;
	char s[MaxOp],*argv[MaxRawNum];
	double num, op;
	char **temp = argv;
	void ungets(char[]);

	scanf("%d", &argc);
	for (int i = 1; i < argc; i++) {
		argv[i] = (char *)malloc(MaxRowNum * sizeof(char));
		scanf("%s", argv[i]);
	}

	while (--argc > 0)
	{
		//ungets(" ");
		ungets(*++temp);
		//上面运用ungets的目的是想直接读取之前scanf函数捕获到的字符串中
		//也就是说将它们先放到缓存区buf中,再对其进行读取
		//而不是用getch中的getchar函数来直接读取输入内容
		//ungets(" ");该语句是因为每次getop读取数字时,为了确定所读取数字的完整性
		//所以在每次读取数字之前事先放入一个空格符,这样可以在不读取新的输入内容时
		//还可以保证getop函数的正常运作
		//不过在该程序中,该语句可以省略,因为scanf遇到空格符、换行符就会停止读取
		//也就是说即使是在缓存区中无任何内容,在输入内容中有一个换行符
		//在第一次读取完数字之后,该换行符就会被压入缓存区
		//之后它就一直待在缓存区,也就是说不用担心因为多读取字符而导致getop函数无法运行的问题
		switch (getop(s))
		{
			case number:
				push(atof(s));
				break;
			case '+':
				num = pop() + pop();
				push(num);
				break;
			case '-':
				op = pop();
				num = pop() - op;
				push(num);
				break;
			case '*':
				num = pop() * pop();
				push(num);
				break;
			case '/':
				op = pop();
				if (op != 0.0) {
					num = pop() / op;
					push(num);
				}
				else
					printf("error: zero divisor\n");
				break;
			//case '\n':
			//	printf("%f\n", pop());
			//	break;	
			//不需要捕获到换行符之后,再输出内容
			default:
				printf("error: unknown command %s\n",s);
				argc = 1;
				break;
		}
	}
	printf("\t%.8g\n", pop());
	return 0;
}

double myatof(char *s)
{
	int sign;
	double num, pow;

	num = 0.0;
	pow = 1.0;
	sign = (*s == '-') ? -1 : 1;
	while (isdigit(*s))
	{
		num = 10.0 * num + *s - '0';
	}
	if (*s == '.')
		s++;
	while (isdigit(*s))
	{
		num = 10.0 * num + *s - '0';
		pow *= 10.0;
	}
	num = sign * num / pow;
	return num;
}

#define MaxVal 100
double operand[MaxVal];
int place = 0;

void push(double op)
{
	//注意限定的范围
	if (place < MaxVal)
		operand[place++] = op;
	else {
		printf("the stack of operand is full, can't push");
		return;
	}
}

double pop(void)
{
	//注意限定范围
	if(place > 0)
		return operand[--place];
	else
	{
		printf("the stack is empty,can't pop\n");
		return 0.0;
	}
}

char getch(void);
void ungetch(char);

char getop(char *s)
{
	char c;

	while ((*s = c = getch()) == ' ' || c == '\t')
		;
	*(s+1) = '\0';
	if (!isdigit(c) && c != '.')
		return c;
	if (isdigit(*++s = c = getch()))//整数部分
		;
	if (c == '.')
		while(isdigit(*++s = c = getch()))//小数部分
			;
	if (c != EOF)
		ungetch(c);
	*s = '\0';
	return number;
}

void ungets(char s[])
{
	void ungetch(char);
	int len = strlen(s);

	while (len > 0)
		ungetch(s[--len]);
}

#define MaxSize 100
char buf[MaxSize];
char *bufp = buf;//buf的下一个空闲位置

char getch()
{
	return (bufp > buf) ? *--bufp : getchar();
}

void ungetch(char c)
{
	if (bufp < buf + MaxSize)
	{
		*bufp = c;
		bufp++;
	}
	else
		printf("there is no space in buffer\n");
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:22:52  更:2022-05-09 12:25:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 1:25:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码