STL stack的所有操作代码展示附例题

stack为先进后出数据结构,在头文件里面。

stacks;          //定义栈,type为数据类型

s.push(item);           //把item放进栈

s.top();                     //返回栈顶的元素

s.pop();                    //删除栈顶的元素

s.size();                    //返回栈中元素的个数

s.empty();                 //检查栈是否为空,如果为空,则返回true

例题1:翻转字符串

输入样例:olleh !dlrow         

输出样例:hello world!

代码如下:

#include
using namespace std;
stack s;
int main() {
    int n;   scanf("%d", &n); getchar();
    while (n--) {
        
        while (true) {
            char ch = getchar();              //一次读入一个字符
            if (ch == ' ' || ch == '\n' || ch == EOF) {
                while (!s.empty()) { printf("%c", s.top()); s.pop(); } //输出并清除栈顶

                if (ch == '\n' || ch == EOF)  break;
    
                printf(" ");
            }
            else    s.push(ch);               //入栈
        }
        printf("\n");
    }
    return 0;
}

代码相关解释:

由于这里while循环里面有char ch = getchar();    

所以在scanf后我们要清除缓冲区里面的换行符。因为你输入数字后按下了Enter键,导致了缓冲区里面有了\n,也就导致了f (ch == '\n' || ch == EOF)  break;直接起作用,导致你输入3最后只有两次效果 因为第一次ch就是\n(缓冲区里面的)直接结束了第一次循环。

例题2:向右看齐

https://www.luogu.com.cn/problem/P2947https://www.luogu.com.cn/problem/P2947代码如下:

#include
using namespace std;
int h[100001], ans[100001];
int main(){
    int n; 	scanf("%d",&n);
for (int i=1;i<=n;i++)  scanf("%d",&h[i]);
    stackst; 
for (int i=n;i>=1;i--){
		while (!st.empty() && h[st.top()] <= h[i])   
		   st.pop();         //栈顶奶牛没我高,弹出它,直到栈顶奶牛更高为止
         if (st.empty())   ans[i]=0;        //栈空,没有仰望对象            
         else              ans[i]=st.top(); //栈顶奶牛更高,是仰望对象
         st.push(i);                        //进栈
	}
	for (int i=1;i<=n;i++)   printf("%d\n",ans[i]);
	return 0;
}

你可能感兴趣的:(STL,c++,数据结构,算法,stl,开发语言)