算法之背包,队列,栈学习

1. 背包(bag):

背包是不支持从中删除元素的集合数据类型;目的是帮助用例收集元素并迭代遍历所有收集到的元素(用例也可以检查背包是否为空,或者获取背包中元素的数量)迭代的顺序不确定并且与用例无关!!!

c++ 中有没有背包的概念,我不清楚,有大神看到回复我一下!!(小白求赐教!)

2. 队列(queue):

队列全称为先进先出队列(FIFO),程序需要使用队列是因为在集合保存元素的同时保存它们的相对顺序;

e.g. 排队买奶茶,先到先下单;排队进影院,先到先进去入座;

c++ 中有queue概念;使用时包含头文件;

#include<queue>

  • 定义queue 对象的示例代码如下:
  • queue<int> q1;
  • queue<double> q2;
  • queue 的基本操作有:
  • 入队,如例:q.push(x); 将x 接到队列的末端。
  • 出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
  • 访问队首元素,如例:q.front(),即最早被压入队列的元素。
  • 访问队尾元素,如例:q.back(),即最后被压入队列的元素。
  • 判断队列空,如例:q.empty(),当队列空时,返回true。
  • 访问队列中的元素个数,如例:q.size().

3. 栈(stack):

栈全称是下压栈。遵循后进先出策略。

e.g. 邮箱里面的邮件,一定是从最新的一封邮件开始查阅作已读标志,依次往前;

c++ 中有stack概念;使用时包含头文件;

#include<stack>

基本操作有

  • 定义stack 对象的示例代码如下:
  • stack<int> s1;
  • stack<string> s2;
  • stack 的基本操作有:
  • 入栈,如例:s.push(x);
  • 出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
  • 访问栈顶,如例:s.top().
  • 判断栈空,如例:s.empty(),当栈空时,返回true。
  • 访问栈中的元素个数,如例:s.size()。
  • 栈顶就是最后一个加进来的元素;

实例运用:

/*************************************************************************
	> File Name: stack_queue.cpp
	> Author:MAQ 
	> Mail: maq046@163.com
	> Created Time: 2019年04月28日 星期日 14时24分06秒
 ************************************************************************/

#include<iostream>
#include<queue>
#include<stack>

using namespace std;

int main(){
    queue<double> myQ;
    for (int i=0;i<5;i++){
        myQ.push(i);
    }
    cout << "myQ size is: "<< myQ.size() << endl;
    while (!myQ.empty()){
        cout << myQ.front()<<endl;
        myQ.pop();
    }
    cout << "myQ size is: " << myQ.size()<<endl;

    stack<double> myS;
    for (int i=0;i<5;i++){
        myS.push(i);
    }
    cout << "myS size is: "<< myS.size() << endl;
    while (!myS.empty()){
        cout << myS.top()<<endl;
        myS.pop();
    }
    cout << "myS size is: " << myS.size()<<endl;

    return 0;
}

>> g++ stack_queue.cpp -o mySQ

>> ./mySQ

myQ size is: 5
0
1
2
3
4
myQ size is: 0
myS size is: 5
4
3
2
1
0
myS size is: 0

4. 算术表达式求值:

例如: ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) )

表达式有花括号、运算符、操作数(就是数字)组成;我们根据以下四种情况从左到右逐个将这些实体送入栈处理:

(用到了两个栈:一个保存运算符;一个保存操作数)

将操作数压入操作数栈;(建立一个string 的栈)

将运算符压入运算符栈;

忽略左括号;

在遇到右括号时,弹出一个运算符,弹出所需数量的操作数,并将运算符和操作数的运算结果压入操作数栈;

到了最后一个右括号之后,操作数栈应该只有一个数值。返回出来就是计算结果。

c++实现代码如下:(参考:https://www.cnblogs.com/Polaris-sanctuary/p/6680222.html)

/*************************************************************************
	> File Name: Dijkstra_doublestacks.cpp
	> Author: MAQ
	> Mail: maq046@163.com
	> Created Time: 2019年04月28日 星期日 15时18分21秒
 ************************************************************************/

#include<iostream>
#include<stack>
#include<string>
#include<cmath>
using namespace std;


int main(){
    stack<double> vals;
    stack<string> ops;


    string tmpstr;

    cout << " Please input the formula: "<<endl;
    cout << " Note: separate each character by a space. Please indicate the subexpression in braces." <<endl;
    cout << " End of input by the string E!"<<endl;

    while (true){
        cin>>tmpstr;
        if (tmpstr=="("){
            continue;
        }
        else if (tmpstr=="+"){
            ops.push(tmpstr);
        }
        else if (tmpstr=="-"){
            ops.push(tmpstr);
        }
        else if (tmpstr=="*"){
            ops.push(tmpstr);
        }
        else if (tmpstr=="/"){
            ops.push(tmpstr);
        }
        else if (tmpstr==")"){
            string op= ops.top();
            double val= vals.top();
            if (op=="+"){
                vals.pop();
                val=vals.top()+val;
                vals.pop();
                vals.push(val);
            }
            if (op=="-"){
                vals.pop();
                val=vals.top()-val;
                vals.pop();
                vals.push(val);
            }
            if (op=="*"){
                vals.pop();
                val=vals.top()*val;
                vals.pop();
                vals.push(val);
            }
            if (op=="/"){
                vals.pop();
                val=vals.top()/val;
                vals.pop();
                vals.push(val);
            }
            ops.pop();
        }
       else if (tmpstr !="E"){
            double val=stod (tmpstr);
            vals.push(val);
        }
        if (tmpstr == "E"){
            break;
        }
    }
    cout << "The result is: ";
    cout << vals.top()<<endl;

    return 0;
}

>> g++ -std=c++11 Dijkstra_doublestacks.cpp -o Calsolver  (注意一下这里用到了c++11编译环境,这个时候才能使用代码中的stod 字符转换成数字操作

>> ./Calsolver

 Please input the formula:
 Note: separate each character by a space. Please indicate the subexpression in braces.
 End of input by the string E!
( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) E
The result is: 101

-------Robert Sedgewick and Kevin Wayne 的《算法》(第四版)ing...------------

/*今日标签*/

简简单单做人,认认真真做事!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值