C++模板寫計算器 帶()

#include "stack.h"
#include <iostream>
using namespace std;


int main()
{
	Stack<int> number_;
	Stack<char> operator_;

	char src[100];
	cout << "請輸入表達式" << endl;
	cin >> src;

	int i = 0;
	

	while (1)
	{
		if (src[i] == '\0')
		{
			int num1;
			int num2;

			while (operator_.Empty() == false)
			{
				num1 = number_.getTop();
				number_.Pop();
				num2 = number_.getTop();
				number_.Pop();
				int result = cal(num2, num1, operator_.getTop());
				operator_.Pop();
				number_.Push(result);//i不增加
			}
			break;
		}
		switch (src[i])
		{
			case '(':
			{
				operator_.Push(src[i]);
				i++;
				break;
			}

			case ')':
			{
				int num1;
				int num2;
				int num3;
				int result;
				int result_n;

				if (compare(operator_.getTop()) == 3)
				{
					num1 = number_.getTop();
					number_.Pop();
					num2 = number_.getTop();
					number_.Pop();
					result = cal(num2, num1, operator_.getTop());
					operator_.Pop();

					if (operator_.getTop() == '(')
					{
						number_.Push(result);
						i++;
						operator_.Pop();
						break;
					}

					else
					{
						num3 = number_.getTop();
						number_.Pop();
						result_n = cal(num3, result, operator_.getTop());
						number_.Push(result_n);
						operator_.Pop();

						operator_.Pop();
						i++;
						break;
					}
				}
				else
				{
					num1 = number_.getTop();
					number_.Pop();
					num2 = number_.getTop();
					number_.Pop();
					result = cal(num2, num1, operator_.getTop());
					operator_.Pop();
					number_.Push(result);
					i++;
					operator_.Pop();
					break;
				}
			}
		
		    case '-':
			case '+':
			{
				if (operator_.Empty() == true)
				{

					operator_.Push(src[i]);
					i++;
					break;
				}
				if (compare(src[i]) <= compare(operator_.getTop()))
				{

					int num1;
					int num2;
					num1 = number_.getTop();
					number_.Pop();
					num2 = number_.getTop();
					number_.Pop();

					int result = cal(num2, num1, operator_.getTop());
					operator_.Pop();
					operator_.Push(src[i]);
					i++;
					number_.Push(result);
					
				}
				else
				{
					operator_.Push(src[i]);
					i++;
				}

				break;
			}
		
			case '*':
			{
				operator_.Push(src[i]); 
				i++;
				break;
			}

			case '/':
			{
				operator_.Push(src[i]);
				i++;
				break;
			}

			
			

			default: 
			{
				int num = 0;

				while (src[i] >= '0' && src[i] <= '9')
				{
					num = num * 10 + my_atoi(src[i]);
					i++;
				}
				number_.Push(num);
				break;
			}


		}

	}

	cout << number_.getTop() << endl;
	
}
上文爲stack.cpp這一部分寫的不是很好,應該把主要計算的main裏面的計算過程寫成函數調用。

#ifndef _STACK_H_
#define _STACK_H_

template<typename T>

class Stack
{
private:
	T * s_;
	int top_;
public:
	Stack();
	~Stack();
	void Push(const T& n);
	void Pop();
	T& getTop()const;
	bool Empty()const;

};

template<typename T>
Stack<T>::Stack() :top_(-1)
{
	s_ = new T[100];
}

template<typename T>
Stack<T>::~Stack()
{
	delete[]s_;
}
template<typename T>
void Stack<T>::Push(const T & n)
{
	if (top_ == 99)
	{
		throw(1);
	}
	top_++;
	s_[top_] = n;
}

template<typename T>
void Stack<T>::Pop()
{
	if (Empty() == true)
	{
		throw(1);
	}
	top_--;
}

template<typename T>
T & Stack<T>::getTop()const
{
	if (Empty() == true)
	{
		throw(1);
	}
	return s_[top_];
}

template<typename T>
bool Stack<T>::Empty()const
{
	return top_ + 1 == 0;
}

int compare(char c)
{
	if (c == '*' || c == '/')
	{
		return 3;
	}
	else if (c == '+' || c == '-')
	{
		return 2;
	}
	else if (c == '(')
	{
		return 1;
	}
	else if (c == '\0')
	{
		return 0;
	}
	else
	{
		return 0;
	}
}

int cal(int n, int m, char c)
{
	if (c == '+')
		return n + m;
	if (c == '-')
		return n - m;
	if (c == '*')
		return n*m;
	if (c == '/')
		return n / m;
}



int my_atoi(char ch)
{
	if (ch >= '0' && ch <= '9')
	{
		return ch - '0';
	}
}
#endif 

這個寫的是一個自己的stack模板類。

在vs2015環境下能夠編譯成功,親測有效生氣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章