收藏 分销(赏)

栈的简单应用.doc

上传人:pc****0 文档编号:6279293 上传时间:2024-12-04 格式:DOC 页数:9 大小:89KB 下载积分:10 金币
下载 相关 举报
栈的简单应用.doc_第1页
第1页 / 共9页
栈的简单应用.doc_第2页
第2页 / 共9页


点击查看更多>>
资源描述
//头文件“stack.h” #ifndef STACK_H #define STACK_H template <class Type> class Node { public: Node(); Node(const Type& date); ~Node(); //private: Type Date; Node<Type> *Next; }; template <class Type> class Stack { public: Stack();//Head->Date不可知 ~Stack(); void Puah_Head(const Node<Type>& node); void Pop_Head(); Type& Top(); void MakeEmpty(); void Travel(); bool IsEmpty(); //private: Node<Type> *Head; }; template <class Type> Stack<Type>::Stack() { Head=new Node<Type>; } template<class Type> void Stack<Type>::MakeEmpty() { Node<Type> *cur=Head; for(;Head->Next!=NULL;) { cur=Head->Next; Head->Next=cur->Next; delete cur; } } template <class Type> Stack<Type>::~Stack() { if(Head->Next!=NULL) MakeEmpty(); delete Head; } template <class Type> void Stack<Type>::Puah_Head(const Node<Type>& node) { Node<Type>* cur=new Node<Type>(node); if(Head->Next!=NULL) cur->Next=Head->Next; Head->Next=cur; } template <class Type> void Stack<Type>::Pop_Head()\ { Node<Type>* cur=new Node<Type>; if(Head->Next==NULL) return; cur=Head->Next; Head->Next=cur->Next; delete cur; } template <class Type> Type& Stack<Type>::Top() { if(Head->Next==NULL) { cout<<"Stack为空"<<endl; return Head->Date; } return Head->Next->Date; } template <class Type> void Stack<Type>::Travel() { Node<Type>* cur=new Node<Type>; cur=Head; for(;cur->Next!=NULL;) { cur=cur->Next; cout<<cur->Date<<endl; } } template <class Type> bool Stack<Type>::IsEmpty() { if(Head->Next==NULL) return true; return false; } template <class Type> Node<Type>::Node():Next(NULL) { ; } template <class Type> Node<Type>::Node(const Type& date):Date(date),Next(NULL) { ; } template <class Type> Node<Type>::~Node() { ; } #endif //主程序cpp文件“main.cpp” #include<iostream> #include<string> #include "string" #include"stack.h" using namespace std; char* Change(int number,int a);//把number转换为a进制的一个数; string PostFix(string exp);//把一个中缀改为后缀; int FindNumber(char a);//把字符转换为数字 int Post(string postfixexp);//计算后缀表达式 char* n; int ShuRu(string ,int& i);//从第i个字符开始,将其到空格之前的所有字符换算成int void main() { //字符串格式 每个操作数或者操作符号后面加一个空格,最后一个操作符号可以不加 //数据为int string a="3424 665 + 542 / 85 * 544 - 7655 +"; int b=Post(a); cout<<a<<"的计算结果为"<<b<<endl; /* char* a=Change(15,16); //15转化为16进制 cout<<a<<endl; */ /* string infixexp; //中缀转换为后缀,输入eof停止 cout<<"连续输入直到输入eof,即ctrl+z"<<endl; cout<<"操作符仅限 ( + - * / )"<<endl; for(;cin>>infixexp;) cout<<"Postfix expression is"<<PostFix(infixexp)<<endl; */ } int Post(string postfixexp) { postfixexp.append(2,' '); Stack<int>* NumberStack=new Stack<int>; int i=0; int number; int first; int last; for(;postfixexp[i]!=32;) { int ch; ch=FindNumber(postfixexp[i]); switch(ch) { case 0: number=ShuRu(postfixexp,i); NumberStack->Puah_Head(number); break; case 2: first=NumberStack->Top(); NumberStack->Pop_Head(); last=NumberStack->Top(); NumberStack->Pop_Head(); number=first+last; NumberStack->Puah_Head(number); i++; break; case 3: first=NumberStack->Top(); NumberStack->Pop_Head(); last=NumberStack->Top(); NumberStack->Pop_Head(); number=last-first; NumberStack->Puah_Head(number); i++; break; case 4: first=NumberStack->Top(); NumberStack->Pop_Head(); last=NumberStack->Top(); NumberStack->Pop_Head(); number=first*last; NumberStack->Puah_Head(number); i++; break; case 5: first=NumberStack->Top(); NumberStack->Pop_Head(); last=NumberStack->Top(); NumberStack->Pop_Head(); number=last/first; NumberStack->Puah_Head(number); i++; break; } i++; } number=NumberStack->Top(); return number; } int ShuRu(string a,int&i) { int b[10]; int num=0; int k=0; int jie=1; for(;a[i]!=32;i++,k++) { b[k]=a[i]-48; jie=jie*10; } b[k]=10; for(int j=0;b[j]<10;j++) { num=num+b[j]*jie/10; jie=jie/10; } return num; } int FindNumber(char a) { if(a=='(') return 1; if(a=='+') return 2; if(a=='-') return 3; if(a=='*') return 4; if(a=='/') return 5; if(a==')') return 6; return 0; } char* Change(int number,int a) { Stack<char>* m=new Stack<char>; int zheng=1; n=new char[100]; char jinzhi[]="0123456789ABCDEF"; //cout<<number<<"转换为"<<a<<"进制后的结果为:"; for(;zheng!=0;number=zheng) { zheng=number/a; m->Puah_Head(jinzhi[number%a]); } for(zheng=0;m->Head->Next!=NULL;zheng++) { n[zheng]=(*m).Top(); m->Pop_Head(); } n[zheng]='\0'; return n; } string PostFix(string exp) { bool flag=true; int TokenNumber,TopTokenNumber; Stack<char>* OpStack=new Stack<char>; string PostFixExp; string Op="0(+-*/)"; string Blank=" "; int j=exp.length(); if(FindNumber(exp[0])>1) flag=false; for(int i=0;i<j;i++) { TokenNumber=FindNumber(exp[i]); switch(TokenNumber) { case 1: OpStack->Puah_Head(exp[i]);break; case 6: for(;;) { if(OpStack->IsEmpty()) { flag=false; break; } TopTokenNumber=FindNumber(OpStack->Top()); OpStack->Pop_Head(); if(TopTokenNumber==1) break; PostFixExp.append(Blank+Op[TopTokenNumber]); }break; case 2: case 3: case 4: case 5:for(;;) { if(i<j-1) if(FindNumber(exp[i+1])>1) { flag=false; break; } if(OpStack->IsEmpty()||((TokenNumber/2)>(FindNumber(OpStack->Top())/2))) { OpStack->Puah_Head(Op[TokenNumber]); break; } else { TopTokenNumber=FindNumber(OpStack->Top()); OpStack->Pop_Head(); PostFixExp.append(Blank+Op[TopTokenNumber]); } } break; case 0:PostFixExp.append(Blank+exp[i]); for(;i<(j-1);) { if(FindNumber(exp[i+1])==1) { flag=false; break; } if(FindNumber(exp[i+1])!=0) break; i++; PostFixExp.append(1,exp[i]); } break; default: flag=false; } } for(;!OpStack->IsEmpty();) { TopTokenNumber=FindNumber(OpStack->Top()); OpStack->Pop_Head(); if(TopTokenNumber==1) { flag=false; break; } else PostFixExp.append(Blank+Op[TopTokenNumber]); } if(!flag) PostFixExp="输入错误"; return PostFixExp; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服