7. 入门并实践STL——stack篇

stack

1. How to use?

#include <stack>
using namespace std;

2. stack的定义

stack<typename> name;

3. 元素的访问

  • 只能通过top()来访问栈顶元素

4. 常用函数解析

  1. push(x): O(1)
  2. top(): O(1)
  3. pop(): O(1)
  4. empty(): O(1)
  5. size(): O(1)
  • stack没有clear()方法,因为stack 没用提供迭代器,而vector或list中clear 是通过迭代器来实现的。
  • 置空方法:while(!s.empty()) s.pop();

5. 常见用途

  • 模拟实现一些递归,防止程序对栈内存的限制而导致程序运行错误

6. 习题

两道习题

  1. 简单计算器
  • 提示

        float num1 = nums.top();
        float num2 = nums.top();
        float re = num2 operaotr num2; // 注意:这里的顺序很容易出错
    
    1. 新的操作符需要与栈顶的操作符进行循环比较,知道比栈顶的优先级高,才可插入栈中。
    2. 我原先是新加的操作符与栈顶的操作符优先级进行比较,只有当栈顶的优先级更高时,才弹出栈顶的操作符,这样做会有问题。当出现2-2-2这样的式子的时候,结果会变成2,所以后面我把判断条件改成了如果当栈顶的优先级更高或者他们的优先级相同时,弹出栈顶的操作符。
  • 此代码提交后会出现段错误,查不出时什么原因,但是这个代码,去掉外层循环,可以在牛客网的相同题目(input只需要输入一行)上accept。猜测不被codeup accept的原因是外层终止条件出现了问题,但是我把网上其他人的终止条件都试过,还是会出现段错误。

#include<iostream>

#include<string>

#include<stack>

#include<queue>

using namespace std;

int N;



int charTpri(char ch) {

        int pri;

        switch (ch) {

        case '+':

               pri = 1;

               break;

        case '-':

               pri = 2;

               break;

        case '*':

               pri = 3;

               break;

        case '/':

               pri = 4;

               break;

        }

        return pri;

}



int main() {

        stack<int> operators;

        stack<double> nums;

        string str = "";

        

        while (getline(cin, str), str != "0") {

               while (!operators.empty()) operators.pop();

               while (!nums.empty()) nums.pop();



               int num = 0;

               // +:1  -:2  *:3  /:4. The bigger, the more prior



               operators.push(0);

               for (int i = 0; i < str.length(); i++) {

                       if (str[i] == ' ') {

                              if (num != 0) {

                                      nums.push(num);

                              }

                              // the previous char is operator

                              else {



                              }

                              // reinit

                              num = 0;

                       }

                       else if (str[i] >= '0' && str[i] <= '9') {

                              num = num * 10 + (str[i] - '0');

                              if (i == str.length() - 1) {

                                      nums.push(num);

                              }



                       }

                       else {

                              int top_pri = operators.top();

                              int cur_pri = charTpri(str[i]);

                              while (top_pri >= cur_pri) {



                                      float num2 = nums.top();

                                      //

                                      nums.pop();

                                      float num1 = nums.top();

                                      

                                      nums.pop();

                                      float res = 0;

                                      if (top_pri == 1) {

                                             res = num1 + num2;

                                      }

                                      else if (top_pri == 2) {

                                             res = num1 - num2;

                                      }

                                      else if (top_pri == 3) {

                                             res = num1 * num2;

                                      }

                                      else {

                                             res = num1 / num2;

                                      }

                                      nums.push(res);

                                      operators.pop();

                                      top_pri = operators.top();

                              }



                              operators.push(cur_pri);



                       }

               }



               while (operators.top() != 0) {

                       int top_pri = operators.top();

                       operators.pop();

                       float num2 = nums.top();

                       nums.pop();

                       float num1 = nums.top();

                       nums.pop();

                       float res = 0;

                       if (top_pri == 1) {

                              res = num1 + num2;

                       }

                       else if (top_pri == 2) {

                              res = num1 - num2;

                       }

                       else if (top_pri == 3) {

                              res = num1 * num2;

                       }

                       else {

                              res = num1 / num2;

                       }
                       nums.push(res);

               }

               printf("%.2f\n", nums.top());

               //getline(cin, str);

        }

        return 0;

}


  1. 括号匹配
#include <stack>

#include <iostream>

#include <string>



using namespace std;

bool matching(char ch1, char ch2) {

        if ((ch1 == '[' && ch2 == ']') ||

               (ch1 == '(' && ch2 == ')') ||

               (ch1 == '{' && ch2 == '}')) return true;

        else return false;

}

stack<char> op;



int main() {

        int N;

        cin >> N;

        // 需要用不带参数的get()方法接收掉换行符

        cin.ignore();

        for (int i = 0; i < N; i++) {

               bool flag = false;

               string str;

               getline(cin, str);

               while (!op.empty()) {

                       op.pop();

               }

               for (int j = 0; j < str.length(); j++) {

                       if (str[j] == '[' || str[j] == '{' || str[j] == '(') {

                              op.push(str[j]);

                       }

                       else if (str[j] == ']' || str[j] == '}' || str[j] == ')') {

                              if (op.empty()) {

                                      flag = false;

                                      break;

                                      //printf("%s\n", "no");



                              }

                              else {

                                      char ch = op.top();

                                      op.pop();

                                      if (matching(ch, str[j])) flag = true;

                                      else {

                                             flag = false;

                                             break;

                                      }

                              }

                       }

                       else {

                              continue;

                       }

               }

               //

               if (flag == true && op.empty()) cout << "yes" << endl;

               else cout << "no" << endl;



        }

        return 0;

}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,646评论 0 13