您的位置:首页 > 理论基础 > 数据结构算法

[数据结构]Polynomial

2016-03-30 18:24 351 查看
//Term.h
#pragma once
class Term
{
public:
Term();
int exp;
double coe;
Term(int exp, double coe);
};

//Term.cpp
#include"Term.h"
#include<iostream>
using namespace std;

Term::Term() {
exp = 0;
coe = 0.0;
}

Term::Term(int exp, double coe){
this->exp = exp;
this->coe = coe;
}

//Extended_queue.h
#pragma once
enum Error_code { success, overflow, underflow };
template<class Queue_entry>
class Extend_Queue
{
public:
Extend_Queue();
Extend_Queue(const Extend_Queue &original);
~Extend_Queue();
void operator=(const Extend_Queue & original);
Error_code append(const Queue_entry &item);
Error_code serve();
Error_code retriver(Queue_entry &item)const;
Error_code serve_and_retrieve(Queue_entry &item);
bool empty()const;
void clear();
int size();
protected:
struct Node
{
Node();
Node(Queue_entry item, Node *add_on = NULL);
Node *next;
Queue_entry entry;
};
int count;

Node *front;
Node  *rear;
};

template<class Queue_entry>
inline Extend_Queue<Queue_entry>::Node::Node()
{
next = NULL;
}

template<class Queue_entry>
inline Extend_Queue<Queue_entry>::Node::Node(Queue_entry item, Node * add_on)
{
entry = item;
next = add_on;
}

//Extended_queue.cpp
#include<iostream>
#include"Extend_Queue.h"
using namespace std;

template<class Queue_entry>
Extend_Queue<Queue_entry>::Extend_Queue() {
count = 0;
Node *front = NULL;
Node *rear = NULL;
}

template<class Queue_entry>
Extend_Queue<Queue_entry>::Extend_Queue(const Extend_Queue & original)
{
Node *temp = original.front;
if (front == original.front)return;
while (temp) {
append(temp->entry);
temp = temp->next;
}
}

template<class Queue_entry>
Extend_Queue<Queue_entry>::~Extend_Queue()
{
clear();
}

template<class Queue_entry>
void Extend_Queue<Queue_entry>::operator=(const Extend_Queue & original){
Node *temp = original.front;
if (front == original.front)return;
while (temp) serve();
while (temp) {
append(temp->entry);
temp = temp->next;
}
}

template<class Queue_entry>
Error_code Extend_Queue<Queue_entry>::append(const Queue_entry & item)
{
if (count == 0) {
front = new Node(item);
rear = front;
count++;
return success;
}
else {
rear->next = new Node(item);
rear = rear->next;
count++;
return success;
}
}

template<class Queue_entry>
Error_code Extend_Queue<Queue_entry>::serve()
{
if (count == 0)return underflow;
if (count == 1) {
rear = NULL;
delete front;
front = NULL;
count--;
return success;
}
Node *temp = front;
front = front->next;
delete temp;
count--;
return success;
}

template<class Queue_entry>
Error_code Extend_Queue<Queue_entry>::retriver(Queue_entry & item) const
{
if (empty())return underflow;
item = front->entry;
return success;
}

template<class Queue_entry>
Error_code Extend_Queue<Queue_entry>::serve_and_retrieve(Queue_entry & item)
{
if (count == 0)return underflow;
retriver(item);
serve();
return success;
}

template<class Queue_entry>
bool Extend_Queue<Queue_entry>::empty() const
{
if (count == 0)return true;
else return false;
}

template<class Queue_entry>
void Extend_Queue<Queue_entry>::clear()
{
while (count) serve();
}

template<class Queue_entry>
int Extend_Queue<Queue_entry>::size()
{
return count;
}

//Polynomial.h
#pragma once
#include"Extend_Queue.cpp"
#include"Term.h"
class Polynomial:private Extend_Queue<Term>
{
public:
Polynomial();
Polynomial::Polynomial(const Polynomial &original);
void operator=(const Polynomial &original);
void read();
void print()const;
void equals_sum(Polynomial p, Polynomial q);
void equals_Difference(Polynomial p, Polynomial q);
void equals_product(Polynomial p, Polynomial q);
Error_code equals_quotient(Polynomial p, Polynomial q);
int degree()const;

private:
void mult_term(Polynomial p, Term t);
};

//Polynomial.cpp
#include "Polynomial.h"
#include<iostream>
#include"Term.h"
using namespace std;

Polynomial::Polynomial()
{
front = NULL;
rear = NULL;
}

Polynomial::Polynomial(const Polynomial & original)
{
Node *temp = original.front;
if (front == original.front)return;
while (temp) {
append(temp->entry);
temp = temp->next;
}
}

void Polynomial::operator=(const Polynomial & original)
{
if (front == original.front)return;
while (!empty()) serve();
Node *temp = original.front;
while (temp) {
append(temp->entry);
temp = temp->next;
}
}

void Polynomial::read()
{
double coe;
bool first_term = 1;
int last_exp, exp;
cout << "请根据提示分别输入系数和指数;" << endl;
cout << "请化简后按照指数由高到低输入,如果出现后一个指数>=前一个指数,自动停止输入。" << endl;
cout << "输入系数为0或者指数为0时同样停止输入" << endl;
do
{
cout << "请输入系数:";
cin >> coe;
if (coe != 0) {
cout << "请输入指数:";
cin >> exp;
if (!first_term&&exp >= last_exp || exp < 0) {
exp = 0;
cout << "读取结束,最后一个数据丢失。" << endl;
}
else {
Term new_term(exp,coe);
append(new_term);
first_term = false;
cout << "输入系数:" << coe << " 指数:" << exp << "成功!" << endl;
}
last_exp = exp;
}
} while (coe!=0.0&&exp!=0);
cout << "输入结束。" << endl;
}

void Polynomial::print() const
{
Node *current_node = front;
bool first_term = true;
while (current_node){
Term current_term = current_node->entry;
if (first_term) {									//打印符号
first_term = false;
if (current_term.coe < 0)cout << '-';
}
else if (current_term.coe >= 0)cout << '+';
else  cout << '-';

double r = (current_term.coe >= 0) ? current_term.coe : -current_term.coe;
if (current_term.coe != 0) {
if (r != -1 && r != 1)cout << r;
if (current_term.exp == 1)cout << "X";
if (current_term.exp > 1)cout << "X^" << current_term.exp;
if ((r == 1 || r == -1) && current_term.exp == 0)cout << r;
}
else cout << 0;
current_node = current_node->next;
}
if (first_term)cout << 0;
cout << endl;
}

void Polynomial::equals_sum(Polynomial p, Polynomial q)
{
clear();
while (!p.empty()||!q.empty()){
Term p_term, q_term;
if (p.degree() > q.degree()) {
p.serve_and_retrieve(p_term);
append(p_term);
}
else if (q.degree() > p.degree()) {
q.serve_and_retrieve(q_term);
append(q_term);
}
else {
p.serve_and_retrieve(p_term);
q.serve_and_retrieve(q_term);
Term result(p_term.exp, p_term.coe + q_term.coe);
if (result.coe != 0)append(result);
}
}
}

void Polynomial::equals_Difference(Polynomial p, Polynomial q)
{
clear();
while (!p.empty() || !q.empty()) {
Term p_term, q_term;
if (p.degree() > q.degree()) {
p.serve_and_retrieve(p_term);
append(p_term);
}
else if (q.degree() > p.degree()) {
q.serve_and_retrieve(q_term);
Term new_term(q_term.exp, -q_term.coe);
append(new_term);
}
else {
p.serve_and_retrieve(p_term);
q.serve_and_retrieve(q_term);
Term new_term(q_term.exp, p_term.coe-q_term.coe);
append(new_term);
}
}
}

void Polynomial::equals_product(Polynomial p, Polynomial q)
{
clear();
Polynomial current_result,previous_result,finate_result;
while (!q.empty()) {
Term q_term;
q.serve_and_retrieve(q_term);
previous_result.mult_term(p, q_term);
finate_result.equals_sum(previous_result, current_result);
current_result = finate_result;
}
while (!finate_result.empty()) {			//存储运算结果
Term result_term;
finate_result.serve_and_retrieve(result_term);
append(result_term);
}
}

Error_code Polynomial::equals_quotient(Polynomial p, Polynomial q)
{
clear();
bool indivisible_flag = false;		//标明是否除尽
if (q.empty())return overflow;
if (q.degree() > p.degree()) return underflow;
Polynomial mult_temp,differ_temp;
Term p_term, q_term, divides_term;
differ_temp = p;
do {
differ_temp.retriver(p_term);
q.retriver(q_term);
divides_term.coe = p_term.coe / q_term.coe;//确定当前商的系数和指数。
divides_term.exp = p_term.exp - q_term.exp;
if (divides_term.exp < 0)indivisible_flag = true;
mult_temp.mult_term(q, divides_term);//将当前商与除数相乘
differ_temp.equals_Difference(differ_temp, mult_temp);//做差
if(divides_term.coe>=0) append(divides_term);//append当前商
Term temp;
differ_temp.retriver(temp);
while (temp.coe == 0 || temp.exp < 0) {//消除非法项,防止print出错
differ_temp.serve();
if (differ_temp.retriver(temp) == underflow) break;
}
} while (!differ_temp.empty() && p_term.exp >= q_term.exp);
if (indivisible_flag)
cout << "It's indivisible.The remainder is abandoned" << endl;
return success;
}

int Polynomial::degree() const
{
if (empty())return -1;
Term temp;
retriver(temp);
return temp.exp;
}

void Polynomial::mult_term(Polynomial p, Term t)
{
clear();
if (t.coe == 0) {
clear();
return;
}
while (!p.empty()) {
Term current_term;
p.serve_and_retrieve(current_term);
Term result(current_term.exp + t.exp, current_term.coe*t.coe);
append(result);
}
}

//Linked_stack.h
#pragma once
enum Error_Code { Success, Underflow, Overflow };
template<class Stack_entry>
class Linked_Stack
{
public:
Linked_Stack();
bool empty()const;
Error_Code pop();
Error_Code top(Stack_entry &item)const;
Error_Code push(const Stack_entry &item);
~Linked_Stack();
void operator=(const Linked_Stack &original);
Linked_Stack(const Stack_entry &item);
void print();
private:
struct Node
{
Node();
Node(const Stack_entry &item, Node *add_on = NULL);
Node *next;
Stack_entry entry;
};
Node *head;
};

template<class Stack_entry>
inline Linked_Stack<Stack_entry>::Node::Node()
{
next = NULL;
}

template<class Stack_entry>
inline Linked_Stack<Stack_entry>::Node::Node(const Stack_entry & item, Node * add_on)
{
next = add_on;
entry = item;
}

//Linked_stack.cpp
#include<iostream>
#include"Linked_Stack.h"
using namespace std;

template<class Stack_entry>
Linked_Stack<Stack_entry>::Linked_Stack() {
head = NULL;
}

template<class Stack_entry>
bool Linked_Stack<Stack_entry>::empty() const
{
if (!head)return true;
else return false;
}

template<class Stack_entry>
Error_Code Linked_Stack<Stack_entry>::pop()
{
if (!head)return Underflow;
Node *temp = head;
head = head->next;
delete temp;
return Success;
}

template<class Stack_entry>
Error_Code Linked_Stack<Stack_entry>::top(Stack_entry & item) const
{
if (!head)return Underflow;
item = head->entry;
return Success;
}

template<class Stack_entry>
Error_Code Linked_Stack<Stack_entry>::push(const Stack_entry & item)
{
head = new Node(item, head);
return Success;
}

template<class Stack_entry>
Linked_Stack<Stack_entry>::~Linked_Stack()
{
while (head) {
Node *temp = head;
head = head->next;
delete temp;
}
}

template<class Stack_entry>
void Linked_Stack<Stack_entry>::operator=(const Linked_Stack & original)
{
Node *temp = original.head;
Linked_Stack <Stack_entry> middle;
if (head == original.head)return;
while (temp) {
middle.push(temp->entry);
temp = temp->next;
}
while (head) pop();
temp = middle.head;
while (temp) {
push(temp->entry);
temp = temp->next;
}
}
template<class Stack_entry>
Linked_Stack<Stack_entry>::Linked_Stack(const Stack_entry & original)
{
Node *new_head, *new_temp, *original_temp = original.head;
if (original == NULL) { new_head == NULL; return; }
new_temp = new_head = new Node(original_temp->entry);
while (original_temp) {
original_temp = original_temp->next;
new_temp->next = new Node(original_temp->entry);
new_temp = new_temp->next;
}
}

template<class Stack_entry>
void Linked_Stack<Stack_entry>::print()
{
Node *temp = head;
while (temp) {
cout << temp->entry << ' ';
temp = temp->next;
}
cout << endl;
}

//main.cpp
#include<iostream>
#include"Polynomial.h"
#include"Linked_Stack.cpp"
void UI() {
cout << "**********************************Polynomial Calc************************************" << endl;
cout << "MENU:" << endl;
cout << "[?].Enter a Polynomial." << endl;
cout << "[+].Pop two Polynomial and add them." << endl;
cout << "[-].Pop two Polynomial and minium them." << endl;
cout << "[/].Pop two Polynomial and divide them." << endl;
cout << "[*].Pop two Polynomial and multiply them," << endl;
cout << "[=].Show current result." << endl;
cout << "[q].To quit the programm." << endl;
}
char get_command() {
cout << "Please enter the command." << endl;
char command;
cin >> command;
while (command != '?'&&command != '+'&&command != '-'&&command != '*'
&&command != 'q'&&command != '='&&command != '/') {
cout << "Invalid enter.please confirm and enter again." << endl;
cin >> command;
}
return command;
}
bool do_command(char command, Linked_Stack <Polynomial> &Store_Polynomials) {
switch (command)
{
case '?': {
Polynomial current;
current.read();
Store_Polynomials.push(current);
cout << "Operate [?] Executed successfully" << endl;
Store_Polynomials.top(current);
current.print();
system("pause");

system("cls");
UI();
break;
}
case'+': {
if (Store_Polynomials.empty())cout << "Stack empty.Command Terminate." << endl;
else {
Polynomial p, q, r;
Store_Polynomials.top(p);
Store_Polynomials.pop();
if (Store_Polynomials.empty()) {
cout << "Stack has just one Polynomial.Command Terminate." << endl;
Store_Polynomials.push(p);
}
else {
Store_Polynomials.top(q);
Store_Polynomials.pop();
r.equals_sum(p, q);
Store_Polynomials.push(r);
cout << "Operate [+] Executed successfully" << endl;
}
}
system("pause");
system("cls");
UI();
break;
}
case'=': {
if (Store_Polynomials.empty())cout << "Stack Empty. Command Terminal." << endl;
else {
Polynomial out;
Store_Polynomials.top(out);
out.print();
}
system("pause");
system("cls");
UI();
break;
}
case'-': {
if (Store_Polynomials.empty())cout << "Stack empty.Command Terminate." << endl;
else {
Polynomial p, q, r;
Store_Polynomials.top(p);
Store_Polynomials.pop();
if (Store_Polynomials.empty()) {
cout << "Stack has just one Polynomial.Command Terminate." << endl;
Store_Polynomials.push(p);
}
else {
Store_Polynomials.top(q);
Store_Polynomials.pop();
r.equals_Difference(p, q);
Store_Polynomials.push(r);
cout << "Operate [-] Executed successfully" << endl;
}
}
system("pause");
system("cls");
UI();
break;
}
case'q': {
cout << "You'll quit the programm." << endl;
system("pause");
return false;
}
case'/': {
if (Store_Polynomials.empty())cout << "Stack empty.Command Terminate." << endl;
else {
Polynomial p, q, r;
Store_Polynomials.top(q);
Store_Polynomials.pop();
if (Store_Polynomials.empty()) {
cout << "Stack has just one Polynomial.Command Terminate." << endl;
Store_Polynomials.push(q);
}
else {
Store_Polynomials.top(p);
Store_Polynomials.pop();
r.equals_quotient(p, q);
Store_Polynomials.push(r);
cout << "Operate [/] Executed successfully" << endl;
}
}
system("pause");
system("cls");
UI();
break;
}
case'*': {
if (Store_Polynomials.empty())cout << "Stack empty.Command Terminate." << endl;
else {
Polynomial p, q, r;
Store_Polynomials.top(p);
Store_Polynomials.pop();
if (Store_Polynomials.empty()) {
cout << "Stack has just one Polynomial.Command Terminate." << endl;
Store_Polynomials.push(p);
}
else {
Store_Polynomials.top(q);
Store_Polynomials.pop();
r.equals_product(p, q);
Store_Polynomials.push(r);
cout << "Operate [*] Executed successfully" << endl;
}
}
system("pause");
system("cls");
UI();
break;
}
}
return true;
}
void main() {
Linked_Stack<Polynomial> Store_Polynomials;
UI();
while (do_command(get_command(), Store_Polynomials));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: