利用C++模板功能实现栈,并进一步实现10以内带括号的表达式求值

ImprovedStack.h

#ifndef ImprovedStack_H
#define ImprovedStack_H

#include<iostream>
using namespace std;
template<typename T>
class Stack{
public:
	Stack();
	~Stack();
	bool empty() const;
	T peek() const;
	void push(T);
	T pop();
	int getSize() const;
	int getCapacity() const;
	void printStack() const;
	void ensureCapacity();
private:
	T * elements;
	int capacity;
	int size;
};

template<typename T>
Stack<T>::Stack(){
	size = 0;
	capacity = 16;
	elements = new T[capacity];
}

template<typename T>
Stack<T>::~Stack(){
	delete [] elements;
}

template<typename T>
bool Stack<T>::empty() const{
	return size == 0;
}

template<typename T>
T Stack<T>::peek() const{
	return elements[size - 1];
}

template<typename T>
void Stack<T>::ensureCapacity(){
	if(size >= capacity){
		T* old = elements;
		capacity = size * 2;
		elements = new T[capacity];
		for(int i = 0; i < size; i++)
			elements[i] = old[i];
		delete [] old;
	}
}

template<typename T>
void Stack<T>::push(T value){
	ensureCapacity();
	elements[size++] = value;
}

template<typename T>
T Stack<T>::pop(){
	return elements[--size];
}

template<typename T>
int Stack<T>::getSize() const{
	return size;
}

template<typename T>
int Stack<T>::getCapacity() const{
	return capacity;
}

template<typename T>
void Stack<T>::printStack() const{
	for(int i = 0; i < size; i ++){
		cout<<elements[i];
	}
	cout<<endl;
	//cout<<endl<<"capacity is: "<<capacity<<endl;
}

#endif

main.cpp

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

int priority(char opt){
	if(opt == '#') return -1;
	else if(opt == '(') return 0; 
	else if(opt == '+' || opt == '-') return 1;
	else if(opt == '*' || opt == '/') return 2;
}

void processAnOperator(Stack<int>& operandStack, Stack<char>& operatorStack){
	char opt = operatorStack.pop();
	int val2 = operandStack.pop();
	int val1 = operandStack.pop();
	switch(opt){
		case '+':
			operandStack.push(val1 + val2);
			break;
		case '-':
			operandStack.push(val1 - val2);
			break;
		case '*':
			operandStack.push(val1 * val2);
			break;
		case '/':
			operandStack.push(val1 / val2);
			break;
	}	
}

int evaluateExpression(const string& expression){
	Stack<int> operandStack;
	Stack<char> operatorStack;
	operatorStack.push('#');	
	for(int i = 0; i < expression.length(); i++){
		if(expression[i] >= '0' && expression[i] <= '9')
			operandStack.push(expression[i] - '0');	
		else if(expression[i] == '(')
			operatorStack.push('(');
		else if(expression[i] == ')'){
			while(operatorStack.peek() != '(') 
				processAnOperator(operandStack,operatorStack);
			operatorStack.pop();
		}
		else if(priority(expression[i]) > priority(operatorStack.peek()))
			operatorStack.push(expression[i]);
		else{
			while(operatorStack.peek() != '#' && priority(expression[i]) <= priority(operatorStack.peek())) 
				processAnOperator(operandStack,operatorStack);
			operatorStack.push(expression[i]);
		}
		cout<<"operandStack: ";
		operandStack.printStack();
		cout<<"operatorStack: ";
		operatorStack.printStack();
		cout<<endl;
	}
	
	while(operatorStack.peek() != '#')
		processAnOperator(operandStack,operatorStack);
	operatorStack.pop();
	return operandStack.pop();
}

int main(){
	string expression;
	cout<<"Enter an expression: ";
	getline(cin,expression);
	cout<< expression << " = "<<evaluateExpression(expression) <<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yy64578537/article/details/80149774