棧~ C++用棧Stack實現數學複合運算
阿新 • • 發佈:2018-12-31
關鍵思想是運算子的優先順序設定,分別使用一個數字棧和一個運算子棧,等到運算子棧為空,運算結束了。
compute.cpp
// compute.cpp : Defines the entry point for the console application. // #include<iostream> using namespace std; #include"StdAfx.h" #include"Stack.h" //先實現一個3+4# //判斷符號優先順序 char Priority(char ch1,char ch2); //傳入出棧的2個數字和一個運算子並且計算該二元運算。比如3+5、8*9 int Compute(int a,int b,char sign); int main(){ Stack<int> number;//數字棧 Stack<char> character;//運算子棧 character.Push('#'); int ch = getchar(); //它從標準輸入裡讀取下一個字元。返回型別為int型,返回值為使用者輸入的ASCⅡ碼,出錯返回-1,比如輸入a ,返回97,輸入3,返回51 char b; b=static_cast<char>(ch);//b是ch轉換的字元 while(b!='#' || character.getTop()!='#'){ if(ch>48 && ch<=57){//這裡非常容易寫錯啊!不是ch>0 && ch<=9,或者b>0 && b<=9; number.Push(ch-48); ch = getchar(); b=static_cast<char>(ch); } else{ switch( Priority( character.getTop(), b)){ case'<'://棧頂元素優先順序低 character.Push(b); ch = getchar(); b=static_cast<char>(ch); break; case'='://脫一個'('括號 並且接收下一個字元 character.Pop(); ch = getchar(); b=static_cast<char>(ch); break; case'>'://出棧並且把運算結果入棧 number.Push(Compute(number.Pop(),number.Pop(),character.Pop())); /*int result=number.Pop()+number.Pop(); cout<<result; number.Push(result);*/ break; } } } // cout<<"運算結果是"<<" "<<number.getTop()<<'\n'; printf("運算結果是 %d \n",number.getTop()); return 0; } char Priority(char ch1,char ch2){ int a; int b; switch(ch1){ case '#' : a=0; break; case '(' : a= 1; break; case '+' : a= 3; break; case '-' : a= 3; break; case '*' : a= 5; break; case '/' : a= 5; break; case '%' : a= 5; break; case '^' : a= 7; break; case ')' : a= 8; break; } switch(ch2){ case '#' : b=0; break; case '(' : b= 8; break; case '+' : b= 2; break; case '-' : b= 2; break; case '*' : b= 4; break; case '/' : b= 4; break; case '%': b= 4; break; case '^' : b= 6; break; case ')' : b= 1; break; } if(a<b) return '<'; else if(a==b) return '='; else return '>'; } //傳入出棧的2個數字和一個運算子並且計算該二元運算。比如3+5、8*9 int Compute(int a,int b,char sign){ int result; switch(sign){ case '+' : result=a+b; break; case '-' : result=a-b; break; case '*' : result=a*b; break; case '/' : result=a/b; break; case '%' : result=a%b; break; case '^' : result=a^b; break; } return result; } /** */
Stack.h
//...................................................................................節點類 #ifndef STACK_H #define STACK_H template<typename T> class Node{ public: T element; Node *next; //建構函式 Node(T element){ this->element = element; next = NULL; } }; //..................................................................................棧類 template<typename T> class Stack{ private: Node<T> *top; int size; public: //建構函式 Stack(){ //頭結點賦值為0; Node<T> *newNode = new Node<T>(0); top = newNode; size = 0;//無需因為頭結點把size 初始化為1; } //返回棧的長度 int stackLength(){ return size; } //判棧為空 bool stackEmpty(){ if(0==size) return true; else return false; } //入棧 void Push(T e){ Node<T> *newNode = new Node<T>(e); newNode->next = top->next; top->next = newNode; size++; } //出棧 T Pop(){ Node<T> *current = top->next; top->next = current->next; T f=current->element; delete current; size--; return f; } //返回棧頂元素 T getTop(){ return top->next->element; } }; #endif