using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Class1
{
private static Dictionary<string, int> _operatorLevel;
public static void Main(string[] arg)
{
Console.WriteLine("Type in the source expr");
string sourceExpression = Console.ReadLine();
Console.WriteLine(InsertBlank(sourceExpression));
string rpnExperssion = ConvertToRPN(InsertBlank(sourceExpression));
Console.WriteLine(rpnExperssion);
Console.WriteLine(GetResult(rpnExperssion));
Console.ReadLine();
}
public static double GetValue(double left, double right, char _operator)
{
switch (_operator)
{
case '+':
return left+right;
case '-':
return left-right;
case '*':
return left*right;
case '/':
return left/right;
}
return 0;
}
public static double GetResult(string source)
{
Stack<string> stack = new Stack<string>();
var list = source.Split(' ');
for (int i = 0; i < list.Length; i++)
{
string current = list[i];
if (Regex.IsMatch(current, "^([0-9]{1,}){1}quot;))
{
stack.Push(current);
}
else if (OperatorLevel.ContainsKey(current))
{
double right = double.Parse(stack.Pop());
double left = double.Parse(stack.Pop());
stack.Push(GetValue(left, right, current[0]).ToString());
}
}
return double.Parse(stack.Pop());
}
public static string ConvertToRPN(string source)
{
StringBuilder result = new StringBuilder();
Stack<string> stack = new Stack<string>();
string[] list = source.Split(' ');
for (int i = 0; i < list.Length ; i++)
{
string current = list[i];
if (Regex.IsMatch(current, "^([0-9]{1,}){1}quot;))
{
result.Append(current + " ");
}
else if (OperatorLevel.ContainsKey(current))
{
if (stack.Count > 0)
{
var prev = stack.Peek();
if (prev == "(")
{
stack.Push(current);
continue;
}
if (current == "(")
{
stack.Push(current);
continue;
}
if (current == ")")
{
while (stack.Count > 0 && stack.Peek() != "(")
{
result.Append(stack.Pop() + " ");
}
//Pop the "("
stack.Pop();
continue;
}
if (OperatorLevel[current] < OperatorLevel[prev])
{
while (stack.Count > 0)
{
var top = stack.Pop();
if (top != "(" &&
top != ")")
{
result.Append(top + " ");
}
else
{
break;
}
}
stack.Push(current);
}
else
{
stack.Push(current);
}
}
else
{
stack.Push(current);
}
}
}
if (stack.Count > 0)
{
while (stack.Count > 0)
{
var top = stack.Pop();
if (top != "(" && top != ")")
{
result.Append(top + " ");
}
}
}
return result.ToString();
}
public static string InsertBlank(string source)
{
StringBuilder sb = new StringBuilder();
var list = source.ToCharArray();
foreach (var temp in list)
{
if (OperatorLevel.ContainsKey(temp.ToString()))
{
sb.Append(" ");
sb.Append(temp.ToString());
sb.Append(" ");
}
else
{
sb.Append(temp);
}
}
return sb.ToString();
}
//运算符字典 方便查询运算符优先级
public static Dictionary<string, int> OperatorLevel
{
get
{
if(_operatorLevel==null)
{
_operatorLevel = new Dictionary<string, int>();
_operatorLevel.Add("+", 0);
_operatorLevel.Add("-", 0);
_operatorLevel.Add("(", 1);
_operatorLevel.Add("*", 1);
_operatorLevel.Add("/", 1);
_operatorLevel.Add(")", 0);
}
return _operatorLevel;
}
}
}
| 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
|---|---|---|
| 计划 | 11 | 13 |
| 开发 | 10 | 12 |
| 需求分析 (包括学习新技术) | 1 | 1 |
| · 生成设计文档 | 1 | 1.5 |
| · 设计复审 (和同事审核设计文档) | 1 | 1 |
| 代码规范 (为目前的开发制定合适的规范) | 1 | 1.5 |
| 具体设计 | 1 | 1.5 |
| 具体编码 | 3 | 4 |
| · 代码复审 | 1 | 1.5 |
| · 测试(自我测试,修改代码,提交修改) | 1 | 1.5 |
| 报告 | 1.5 | 2 |
| · 测试报告 | 1 | 1.5 |
| 计算工作量 | 1 | 2 |
| · 事后总结 ,并提出过程改进计划 | 1 | 1 |
总结:
这次作业,让我从初期收集资料,到后面做完任务,完整的进行了一次任务计划,让我体会到在做项目时,提前做好规划的重要性。做好前期收集资料和计划,可以在做项目时少走很多的弯路,加快完成的速度,缩短完成时间。
在编写过程中,会出很多小问题,有时请教一下身边的同学,问题会很快解决。以后的项目遇到不会的,也要问老师,问同学,问题就会迎刃而解。在编码的时候,出现了错误,自己有时会解决不了,自己的编码水平还是差了很多。在编码的过程中,还可以把不懂的地方,想不通的地方,靠自己前期收集的资料和同学,可以学到,理解,并知道该怎么用,怎么写。只有多写代码,自己的编码水平,才可以更好的提高。只记住,不实践,就不可以化为己用。
然后就是自己的整体水平还是差很多,很多细枝末节的东西,自己没有完全了解,导致进度变慢,以后要多学习相关知识,加强自己的水平。
浙公网安备 33010602011771号