标准库的栈
- 定义:stack<typename> myStack;
- 大小:size()
- 压栈:push()
- 弹栈:pop()
- 栈顶:top()
- 判空:empty()
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {stack<int> myStack;printf("%d\n",myStack.size());for (int i = 0; i < 10; ++i) {myStack.push(i);}printf("%d\n",myStack.size());while(!myStack.empty()){printf("%d\n",myStack.top());myStack.pop();}printf("stack is empty.");return 0;
}
例题
【提交地址】
分析
int:4byte
unsigned:4byte
long long:8byte
unsigned long long:8byte
代码
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {stack<long long> myStack;int n;scanf("%d",&n);for (int i = 0; i < n; ++i) {long long temp;scanf("%lld",&temp);myStack.push(temp);}while(!myStack.empty()){printf("%lld ",myStack.top());myStack.pop();}return 0;
}
括号匹配
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {char buf[200];while(fgets(buf,200,stdin) != NULL){string str = buf;str.pop_back();//去掉额外的换行stack<unsigned> indexStack;//存储左圆括号下标string res;//保存输出结果for (unsigned i = 0; i < str.size(); ++i) {if (str[i]=='('){indexStack.push(i);res.push_back('$');} else if(str[i]==')'){if (indexStack.empty()){res.push_back('?');} else{res.push_back(' ');res[indexStack.top()]=' ';indexStack.pop();}}else{res.push_back(' ');}}printf("%s\n%s\n",str.c_str(),res.c_str());}return 0;
}
计算器
【提交地址】
思路
- 使用map,表示各运算符之间的优先级,以便后续的比较
- 维护两个栈,一个double类型的数据栈,一个char类型的运算符栈
- 输入控制,输入使用fgets存入一个char数组中,然后定义一个字符串formula接收数组中存的算式,字符串使用pop_back()排除末尾的换行符
- 接下来根据表达式的长度,对字符串formula从左往右进行遍历:
- 如果输入的是数字,设置一个字符串num接收
- 如果输入的是空格,如果num非空,表明空格前是刚输入的数字,需要把num的内容转化成double类型数据,压入数据栈中,然后将num值置为空;如果num已经为空,表明空格前输入的是运算符,不需要操作
- 其他的情形:
- 输入的是终结符’$',结尾之前若num非空,,那么将num的数据转为double压入数据栈,运算符压入运算符栈中
- 输入的是运算符
- 如果之前运算符栈为空,那么压入运算符栈中
- 如果之前运算符栈非空
- 如果当前运算符优先级大于栈顶运算符优先级,那么压入运算符栈中
- 如果当前运算符优先级小于栈顶运算符优先级,从运算符栈弹出栈顶运算符,依次弹出数据栈栈顶两个数据,第一个弹出的作为右运算符,第二个弹出的作为左运算符,然后计算得到值压入数据栈中;最后运算符压入运算符栈中
- 结束,输出结果
代码
#include <cstdio>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;int main() {char form[1000];map<char,int> priority={{'$',0},{'+',1},{'-',1},{'*',2},{'/',2},};while(fgets(form,1000,stdin) != NULL){string formula = form;formula.pop_back();if (formula == "0"){break;}formula.push_back('$');//补充一个虚拟终止符string num;//用来收集单独的数字以组成一个数字stack<double> number;stack<char> option;for (unsigned i = 0; i < formula.size(); ++i) {if (formula[i]>='0'&&formula[i]<='9'){num.push_back(formula[i]);}else if(formula[i]==' '){if (num != ""){number.push(stod(num));//stod=>string to doublenum="";}}else{if (formula[i]=='$'){if (num != ""){number.push(stod(num));//stod=>string to doublenum="";}}while(!option.empty()&&priority[option.top()]>=priority[formula[i]]){//新来的运算符优先级不高于栈顶的优先级char oper = option.top();option.pop();double rhs = number.top();number.pop();double lhs = number.top();number.pop();switch (oper) {case '+':number.push(lhs+rhs);break;case '-':number.push(lhs-rhs);break;case '*':number.push(lhs*rhs);break;case '/':number.push(lhs/rhs);break;}}//比expr[i]优先级更高的运算都计算过了option.push(formula[i]);}}printf("%.2lf",number.top());}return 0;
}