关键思想是运算符的优先级设置,分别使用一个数字栈和一个运算符栈,等到运算符栈为空,运算结束了。
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
相关推荐
用栈实现了计算器。编程语言是c++. struct save1 { char n[MAX]; int top; }stack1; struct save2 { char n[MAX]; int top; }stack2; //stack1存储数字,stack2存储运算符号.
用java实现的栈Stack类,不继承任何集合类,用对象数组实现
使用c++标准库实现如"3+(3*5)"字符串的运算解析,本例子在Dev C++11中编译运行正常
对于不会用堆栈和对堆栈理解不是很深入深入的初学者来说是一个不容错过的资料。拿来和大家共享一下!
C++栈类模板 template class Stack { public: Stack(void); void Push(const T &item;); //将元素item压入栈 T Pop(void); //将栈顶元素弹出栈 void ClearStack(void); T Peek(void)const; //访问栈顶元素 ...
C++栈基于类实现十进制转N进制; C ++ class-based stack transfer N-ary Decimal.
在C++中,顺序栈的实现通常涉及一个类,该类包含一个数组来存储栈中的元素,以及一个表示栈顶位置的整数。以下是一个简单的顺序栈实现的示例说明: 首先,我们定义一个顺序栈类SequentialStack,并在其构造函数中...
栈的实现,Stack栈使用符号进出 静态栈,与链表栈的实例
心希盼 c++ STL Stack(栈) 包含了用List和Vector来实现的Stack 详细说明请看“心希盼 Stack.doc”
实验目的 1. 掌握栈的操作特性及其顺序存储和链式存储结构 2. 灵活运用栈解决实际问题。 实验内容 利用栈实现算符优先法进行表达式求值,测试表达式为: 5*(3+2)-6/2# 提示:利用c++的stack容器。
c++ 利用数组做底层存储,实现入栈 出栈 栈空/满判断等基本操作,计算器实现加减乘除简单功能 ,支持中缀表达式
c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈
用c++模版实现的stack类,供初学者学习。 template ,int N> class Stack { public: Stack(); ~Stack(); void push(T t); T pop(); bool isEmpty(); private: T *m_pT; const int m_maxSize; ...
标准的表达式如"A+B",在数学上学名叫中缀表达式(Infix Notation),原因是运算符号在两个运算对象的中间。相对应的还有前缀表达式(Prefix Notation),如:"+ - A * B C D",转换成中缀表达式为:"A - B * C + D...
使用C++描述,数组实现的栈。实现了栈的基本操作。包括拷贝构造函数和操作符重载。
开发类C++类 实现 链表,栈的代码 ,用C++类来实现数据结构中的基本抽象数据类型
stack.h为栈的实现,testStack.c为stack的用法
使用C++自制栈,根据大小改变类,方法简单。这是简易版,会发完成版的。打开.txt文件,修改typedef (类型) type,修改const int big = ...。把修改后的源码打在编译器里,保存Stack.h,#include <文件夹路径\Stack.h...
本文实例为大家分享了C++栈(stack)的模板类实现代码,供大家参考,具体内容如下 1.基本概念 栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入、进栈)即...
堆栈类stack的C++实现,包含了栈类的常规操作和方法,对初学者很有用哦。。