周六900C++班级-20230211-栈

栈定义:

栈是一种自下而上的数据结构类型,遵循元素先进后出后进先出的特点,可以通过数组模拟也可以通过头文件<stack>来导入

 

 

 数组模拟的栈定义:

int stack[1001]; //长度1001的栈 
int top = -1; //栈顶指针 

<stack>头文件的栈定义:

#include<stack>
stack<int> q; //定义了整型栈q

以下是栈常见的五个操作:空栈empty,入栈push,出栈pop,栈顶top,清空clear

空栈empty:判断一个栈是否为空

数组模拟:

if(top==-1) //空栈
if(top!=-1) //非空

<stack>头文件:

if(q.empty()) //条件为真是空栈
if(!q.empty()) //条件为真是非空

 

入栈push:将元素x加入到栈中

数组模拟:

stack[++top] = x;//先对top++,然后将元素x放入栈stack中的下标top位置 

<stack>头文件:

stack<int> q;
q.push(x);

出栈pop:将栈顶元素出栈

数组模拟:

if(top!=-1) //如果栈不为空
    top--;//栈顶下标-1即为栈顶元素出栈

<stack>头文件:

if(!q.empty()) //如果栈非空
    q.pop()

栈顶top:

数组模拟:

if(top!=-1)
    stack[top]; 

<stack>头文件:

if(!q.empty())
    q.top()

清空clear:将栈清空

数组模拟:

top = -1

<stack>头文件:

while(!q.empty()) //当栈非空时
    q.pop() //栈顶不断出栈 

____________________________________________________________

TZOJ:1218: 数据结构练习题――栈

描述

请你定义一个栈,可以对栈进行“压入堆栈”、“弹出栈顶元素”、“清空堆栈”、“获取栈顶元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,栈元素均为整数。栈的最大元素个数为1000。

输入

输入各个命令它们对应的格式如下:

压入堆栈:push a,a代表压入堆栈的元素,这里push和元素之间用空格分隔。

清空堆栈:clear

获取栈顶元素:top

弹出栈顶元素:pop

当输入的命令为exit时,程序结束。

 

输出

 

当输入的命令为pop时,请输出弹出的元素值。

当输入的命令是top时,请输出当前栈顶元素值。

注意,如果没有满足的元素,请输出None。

 

样例输入

 

push 1
top
clear
push 2
pop
exit

样例输出

1
2

#include<bits/stdc++.h>
using namespace std;

int a[1020];
string b;
int top;

int main(){
    while(cin>>b){
        if(b=="exit")break;
        if(b=="push"&&top<1000){
            int c;
            cin>>c;
            a[++top]=c;
        }
        if(b=="pop"){
            if(top>0)cout<<a[top--]<<endl;
            else cout<<"None"<<endl;
        }
        
        if(b=="top"){
            if(top>0)cout<<a[top]<<endl;
            else cout<<"None"<<endl;
        }
        if(b=="clear")top=0;
    }
    return 0;
}

7676: 括弧匹配检验

描述

 

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。

现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。

 

 

输入

 

输入仅一行字符(字符个数小于255)。

 

输出

 

匹配就输出 “OK” ,不匹配就输出“Wrong”。

 

样例输入

 [(])

样例输出

Wrong

 

#include<bits/stdc++.h>
using namespace std;
int find(char a[])
{
    char s[305];
    int top = -1;
    for(int i=0;i<strlen(a);i++)
    {
        if(a[i]=='(' || a[i]=='[' || a[i]=='{')
            s[++top] = a[i];
        else if(a[i]==')' && s[top]!='(')return 0;
        else if(a[i]==']' && s[top]!='[')return 0;
        else if(a[i]=='}' && s[top]!='{')return 0;
        else top--;
    }
    if(top!=-1)return 0;
    else return 1;
}
int main()
{
    char a[300];
    cin>>a;
    if(find(a))cout<<"OK";
    else cout<<"Wrong";
     return 0;
}

4873: 表达式求值

描述

 

给定一个只包含加法和乘的算术表达式,请你编程计算表达式的值。

 

输入

 

输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“ +”和乘法运算符“ *”,且没有括号,所有参与运算的数字均为0到2^31 -1之间的整数。输入数据保证这一行只有 0~ 9、+、* 这 12 种字符。

 

数据范围

对于 30% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100;

对于 80% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤1000;

对于 100% 的数据,0≤表达式中加法运算符和乘法运算符的总数≤100000。

 

 

输出

 

输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于4位时,请只输出最后4位,前导0不输出。

 

样例输入

 1+1*3+4

样例输出

 

8

#include<bits/stdc++.h>
using namespace std;
int cal(int a,int b,char op)
{
    switch(op)
    {
        case '+':return a+b%10000;break;
        case '*':return a*b%10000;break;
    }
}
int find(string k)
{
    int num = 0;
    for(int i=0;i<k.length();i++)
    {
        num = num*10+(k[i]-'0');
    }
    return num;
}
int main()
{
    int a,b;
    char c;
    stack<char> s;
    stack<int> q;
    cin>>a;
    q.push(a%10000);
    while(c=getchar(),c!='\n')
    {
        cin>>a;
        //cout<<c<<a<<endl;
        q.push(a);
        if(c=='*')
        {
            int x = q.top();q.pop();
            int y = q.top();q.pop();
            q.push(x*y%10000); 
        }
    }
    int sum = 0;
    while(!q.empty())
    {
        int x = q.top();q.pop();
        //cout<<x<<endl;
        sum+=x;
        sum%=10000;
    }
    cout<<sum;
     return 0;
}

 

posted @ 2023-02-14 14:41  CRt0729  阅读(41)  评论(0编辑  收藏  举报