计算器 - 栈的应用

头文件CHAR.H

#pragma once
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
class CHAR
{
private:
	typedef struct StackNode
	{
		char data;
		struct StackNode *next;
	}*Stack;

public:
	Stack S = NULL;
	CHAR()
	{
		InitStack();
	}

	int InitStack()//初始化
	{
		S = NULL;
		return OK;
	}

	int Push(char e)//入栈
	{
		Stack p = new StackNode;
		p->data = e;
		p->next = S;
		S = p;
		return OK;
	}

	char Pop()//出栈
	{
		if (S == NULL) return ERROR;
		int e = S->data;
		Stack p = S;
		S = S->next;
		delete p;
		return e;
	}

	char GetTop()//获得栈顶元素
	{
		if (S == NULL) return ERROR;
		return S->data;
	}

	int StackEmpty()
	{
		if (S == NULL)
		{
			return 0;
		}
		else
		{
			return 1;
		}
	}


};




LINKSTACK.H

#pragma once
#include<iostream>
#define OK 1
#define ERROR 0
using namespace std;
class LinkStack
{
	private :
		typedef struct StackNode
		{
			int data;
			struct StackNode *next;
		}*Stack;

	public :
		Stack S = NULL;
		LinkStack()
		{
			InitStack();
		}

		int InitStack()//初始化
		{
			S = NULL;
			return OK;
		}

		int Push(int e)//入栈
		{
			Stack p = new StackNode;
			p->data = e;
			p->next = S;
			S = p;
			return OK;
		}

		int Pop()//出栈
		{
			if (S == NULL) return ERROR;
			int e = S->data;
			Stack p = S;
			S = S->next;
			delete p;
			return e;
		}

		int GetTop()//获得栈顶元素
		{
			if (S == NULL) return ERROR;
			return S->data;
		}

		int StackEmpty()
		{
			if (S == NULL)
			{
				return 0;
			}
			else
			{
				return 1;
			}
		}
		

};


#include"LinkStack.h"
#include"CHAR.h"
#include<iostream>
using namespace std;
int In(char ch)//判断是否为数字
{
	if (ch >= '0' && ch <= '9')
	{
		return 1;
	}
	return 0;
}

char Precede(char a, char b)
{
	char c;
	if (a == '#' && b != '#') c = '<';
	if (a == '#' && b == '#') c = '=';
	else if ( a == '+' || a == '-')
	{
		if (b == '+' || b == '-' || b == ')' || b == '#')
		{
			c = '>';
		}
		else
		{
			c = '<';
		}
	}
	else if (a == '*' || a == '/')
	{
		if (b == '(')
		{
			c = '<';
		}
		else
		{
			c = '>';
		}
	}
	else if (a == '(')
	{
		if (b == ')')
		{
			c = '=';
		}
		else if (b == '+' || b == '-' || b == '*' || b == '/' || b == '(')
		{
			c = '<';
		}
	}
	else if (a == ')')
	{
		if (b == '+' || b == '-' || b == '*' || b == '/' || b == ')')
		{
			c = '>';
		}
	}
	return c;
}

int Operate(int a, char b, int c)//运算函数
{
	int sum = 0;
	switch (b)
	{
		case '+':
			sum = a + c;
			break;
		case '-':
			sum = a - c;
			break;
		case '*':
			sum = a * c;
			break;
		case '/':
			sum = a / c;
			break;
		default:
			break;
	}
	return sum;
	return 0;
}


int main()
{
	LinkStack OPND;
	CHAR OPTR;
	int num = 0;
	OPTR.Push('#');
	char theta;//运算符
	int a, b;//运算数
	char ch;//输入
	cin >> ch;
	while (ch != '#' || OPTR.GetTop() != '#')
	{
		if (In(ch))
		{
			num = ((ch - '0') + num * 10);
			cin >> ch;
		}
		else
		{
			if (num != 0)
			{
				OPND.Push(num);
				num = 0;
			}
			switch (Precede(OPTR.GetTop(), ch))
			{
				case '<':
					OPTR.Push(ch);
					cin >> ch;
					break;
				case '>':
					theta = OPTR.Pop();
					b = OPND.Pop();
					a = OPND.Pop();
					OPND.Push(Operate(a, theta, b));
					break;
				case '=':
					OPTR.Pop();
					cin >> ch;
					break;
			}
		}
	}
	cout << OPND.GetTop();
	return 0;
}
经过这学期对数据结构的学习, 我们学习了理论知识, 了解了数据结构设计的思想, 这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查 我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同 时也让我们认清自己的不加以弥补和加强。足之处和薄弱环节,加以弥补和加强。 说起数据结构,它为程序提供了一种思想。计算机本身是无生命的机器,要是计算 机能够运行起来,为人类完成各种各样的工作,就必须让他执行相应的程序,这些程序 都是依靠程序设计语言编写出来的。它是一种思想,在编写程序时可以方便、灵活地运 用。同时,他还向程序员提供了直接操作计算机硬件的功能,具备低级语言的特点,适 合各种类型的软件开发。 说到课程设计,要明确自己的目标。在课设前要明确实训的相关要点,课程设计为 学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结 合起来,锻炼分析解决实际问题的能力。提高适应实际,实践编程的能力。课程设计的 基本理论是该课程设计的 C 语言为基础,掌握程序设计方法,为科学研究中的基层开发 工作奠定良好基础;同时培养学生的分析能力、设计能力和整体设计思想,以提高学生 的科学研究素质和在工作岗位中的具体应用能力。课程设计内容和基本要求,首先课程 设计内容是利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目, 熟悉程序编写,及时查究错误,独立完成。 通过本次课程设计, 自学掌握了随机函数与文件读写的知识, 独立完成了设计任务, 虽然思路和想法还有些不成熟,但是对自己的设计能力有很大的提高,今后仍要更加努 力的深入钻研,是自己的能力有进一步的提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值