1、栈的基本使用
操作受限的线性表,元素只能从栈顶出入,使用时加头文件 #include <stack>。
stack<typename> myStack | 定义 |
myStack.push() | 压栈 |
myStack.pop() | 弹栈 |
myStack.empty() | 判断是否为空,返回bool |
myStack.top() | 获取栈顶元素 |
myStack.size() | 获取栈大小 |
依次压入0-9再弹出栈:
#include <cstdio>
#include <stack>
using namespace std;
int main(){
stack<int> myStack;
printf("size of myStack is %d\n",myStack.size());
for (int i=0;i<10;i++){
myStack.push(i);
}
printf("size of myStack is %d\n",myStack.size());
while(!myStack.empty()) {
printf("cur top is %d\n",myStack.top());
myStack.pop();
}
printf("My stack is empty now.\n");
}
2、栈的例题
牛客网 KY109 Zero-complexity Transposition
描述
You are given a sequence of integer numbers. Zero-complexity transposition of the sequence is the reverse of this sequence. Your task is to write a program that prints zero-complexity transposition of the given sequence.
输入描述:
For each case, the first line of the input file contains one integer n-length of the sequence (0 < n ≤ 10 000). The second line contains n integers numbers-a1, a2, …, an (-1 000 000 000 000 000 ≤ ai ≤ 1 000 000 000 000 000).
输出描述:
For each case, on the first line of the output file print the sequence in the reverse order.
示例1
输入:
5 -3 4 6 -8 9
输出:
9 -8 6 4 -3
【思路】☆
估计题目数据范围:参考——=1024≈
int 4B=32bit -~0~-1 -2x~2x unsigned int 4B=32bit 0~-1 0~4x long long 8B=64bit -~0~-1 -8x~8x unsigned long long 8B=64bit 0~-1 0~16x 若是题目数据范围超过 16x,则将其存入字符串,自定义函数进行处理。
#include <cstdio>
#include <stack>
using namespace std;
int main(){
stack<long long> myStack;
long long num;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&num);
myStack.push(num);
}
while(!myStack.empty()){
printf("%lld ",myStack.top());
myStack.pop();
}
}
POJ括号匹配
描述
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注.
输入
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
注意:cin.getline(str,100)最多只能输入99个字符!
输出
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"" , " ? " 和 空 格 组 成 , " ","?"和空格组成,"","?"和空格组成,"“和”?"表示与之对应的左括号和右括号不能匹配。
样例输入
((ABCD(x)
)(rttyy())sss)(
样例输出
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
【思路】
1、使用栈的结构,左括号进栈,右括号出栈
左括号:遇到一个左括号先设置匹配失败,后面有右括号匹配上再设置匹配成功(需要能够记录位置信息)
右括号:栈为空时出栈则非法;正常匹配时,一个右括号自己合法,也可以“解救”一个栈顶左括号合法
2、读取字符串的操作 char buf[1000]
读取单词 scanf("%d",buf) ——>Ctrl+D: EOF
读取一行 fgets(buf, 1000, stdin) ——>Ctrl+D:NULL
额外读取一个换行,去掉换行:strin str = buf; str.pop_back();
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
int main(){
char buf[200];
while(fgets(buf,200,stdin)!=NULL){//fegts配合while实现不确定数量的多行读取
string str = buf;
str.pop_back();//去掉读取内容最后额外的换行
stack<unsigned int> index; //储存左括号下标
string res;//保存输出结果
for(int i=0;i<str.size();i++){
if(str[i]=='('){
index.push(i);//左括号下标入栈
res.push_back('$');//初始认为左括号非法
}
else if(str[i]==')'){
if(index.empty()){//栈空,此右括号匹配失败
res.push_back('?');
}
else{//匹配成功,
res.push_back(' '); //自己合法了
res[index.top] = ' ';//与它配对的左括号置为合法
index.pop();
}
}
else{
res.push_back(' ');
}
}
}
printf("%s\n%s\n",str.c_str(),res.c_str()); //将C++风格转为C风格才能输出
}