数据结构3.2栈的应用

  1 #define _CRT_SECURE_NO_WARNINGS 1
  2
  3 #include
  4 #include
  5 #include<string.h>
  6 #include
  7 #include
  8 using namespace std;
  9
 10 #define StackSize 10
 11 typedef char DataType;
 12
 13 /*-------------------栈的基本操作------------------*/
 14 typedef struct SqStack
 15 {
 16     DataType data[StackSize];  //保存栈中元素,元素的类型为DataType
 17     int top;   //栈指针,top的取值范围0~StackSize-1;top=-1表示栈空;top=StackSize-1表示栈满;top++表示进栈;top--表示出栈
 18
 19 }SqStack;
 20
 21 //初始化
 22 void InitStack(SqStack& pst)//pst为引用型参数(C++)
 23 {
 24     pst.top = -1;
 25 }
 26
 27 //进栈:栈指针加1,将栈顶元素放进栈顶处
 28 void Push(SqStack& pst, DataType x)
 29 {
 30     if (StackSize - 1 == pst.top)
 31     {
 32         printf("栈已满\n");
 33         return;
 34     }
 35     else {
 36         pst.top++;
 37         pst.data[pst.top] = x;
 38     }
 39
 40 }
 41
 42 //出栈:先将栈顶元素取出,然后将栈指针减一
 43 DataType Pop(SqStack& pst)
 44 {
 45     if (-1 == pst.top)
 46     {
 47         printf("栈为空\n");
 48         return -1;
 49     }
 50     else {
 51         int x = pst.data[pst.top];
 52         pst.top--;
 53         return x;
 54     }
 55 }
 56
 57 //查看栈顶元素:将栈指针top出的元素返回
 58 DataType GetTop(SqStack st)
 59 {
 60     if (-1 == st.top)
 61     {
 62         printf("栈为空\n");
 63         return -1;
 64     }
 65     else
 66         return st.data[st.top];
 67 }
 68
 69 //判断栈是否为空
 70 bool StackEmpty(SqStack st)
 71 {
 72     if (-1 == st.top)
 73     {
 74         return 1;
 75     }
 76     else {
 77         return 0;
 78     }
 79 }
 80
 81 void ClearStack(SqStack& pst) {
 82     for (int i = pst.top; i > 0; i--) {
 83         Pop(pst);
 84     }
 85     cout << "栈已清空" << endl;
 86 }
 87
 88 //打印
 89 void SeqListPrint(const SqStack st)
 90 {
 91     int i = 0;
 92     for (i = 0; i < StackSize; i++)
 93     {
 94         printf("%d ", st.data[i]);
 95     }
 96     printf("\n");
 97 }
 98
 99 /*---------------------栈的应用--------------------*/
100 //进制转换
101 void conversion() {
102     SqStack s;
103     SqStack& ps = s;
104     InitStack(s);
105     int N;
106     cout << "输入你要转换的数字:" << endl;
107     cin >> N;
108     cout << "输入你要转换的进制:" << endl;
109     int n;
110     cin >> n;
111     while (N) {
112         Push(s, N % n);
113         N = N / n;
114     }
115     while (!StackEmpty(s)) {
116         DataType e;
117         e = Pop(s);
118         cout << e;
119     }
120 }
121
122 //括号匹配,需要将DateType改为char
123 void Kuohao() {
124     //输入为左边括号时直接入栈,输入为右边括号时出栈一个,输入的符号和出栈的符号做匹配判断
125     SqStack s;
126     SqStack& ps = s;
127     InitStack(s);
128
129     char a[6];
130     cout << "输入6个括号" << endl;
131     for (int i = 0; i < 6; i++) {
132         cin >> a[i];
133     }
134     for (int i = 0; i < 6; i++) {
135         if (StackEmpty(s)) {
136             if (a[i] == '{' || a[i] == '(' || a[i] == '[') {
137                 Push(s, a[i]);
138             }
139             else {
140                 cout << "无法匹配";
141                 break;
142             }
143         }
144         else {
145             if (a[i] == '{' || a[i] == '(' || a[i] == '[') {
146                 Push(s, a[i]);
147             }
148             else {
149                 DataType e = Pop(s);
150                 if (e == '{' && a[i] != '}') {
151                     cout << "匹配失败!" << endl;
152                     break;
153                 }
154                 else if(e == '[' && a[i] != ']'){
155                     cout << "匹配失败!" << endl;
156                     break;
157                 }
158                 else if (e == '(' && a[i] != ')') {
159                     cout << "匹配失败!" << endl;
160                     break;
161                 }
162                 cout << "匹配成功" << endl;
163             }
164         }
165     }
166 }
167
168 //行编辑程序。输入#退格,输入@退行
169 void LineEdit() {
170     SqStack s;
171     SqStack& ps = s;
172     InitStack(s);
173     DataType ch = getchar();
174         while (ch != '\n') {        //终端接受第一个字符
175             switch (ch)
176             {
177             case '#':
178                 Pop(s); break;
179             case '@':
180                 ClearStack(s); break;
181             default:
182                 Push(s, ch); break;
183             }//switch
184             ch = getchar();
185         }//whilenn
186     SeqListPrint(s);
187 }
188
189 void Test()
190 {
191     SqStack s;
192     SqStack& ps = s;
193     InitStack(s);
194
195     Push(ps, 1);
196     Push(ps, 2);
197     Push(ps, 3);
198     Push(ps, 4);
199     Push(ps, 5);
200     SeqListPrint(s);
201
202     printf("此时栈顶元素为:%2d\n", GetTop(s));
203
204     printf("出栈元素为:%2d", Pop(ps));
205     printf(",此时栈顶元素为:%2d\n", GetTop(s));
206     printf("出栈元素为:%2d", Pop(ps));
207     printf(",此时栈顶元素为:%2d\n", GetTop(s));
208
209     StackEmpty(s);
210 }
211
212 int main()
213 {
214     //Test();
215     //conversion();
216     //Kuohao();
217     LineEdit();
218     system("pause");
219     return 0;
220 }

Original: https://www.cnblogs.com/JIAcheerful/p/16150304.html
Author: 云霄雨霁
Title: 数据结构3.2栈的应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622517/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【设计模式】之桥接模式

    定义 桥接模式(Bridge Pattern)定义:将抽象化与实现化分离,使得双方可以独立变化。 当然定义什么的通常都晦涩难懂,咱们还是借助例子来理解。 举例 还是举个例子吧。 假…

    数据结构和算法 2023年6月12日
    0108
  • 树-线索化二叉树

    线索化二叉树 先看一个问题 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3,…

    数据结构和算法 2023年6月12日
    068
  • 链表和数组的区别

    链表和数组的区别 参考链接:https://techdifferences.com/difference-between-array-and-linked-list.htmlhtt…

    数据结构和算法 2023年6月7日
    0101
  • Git学习笔记

    一:git简介 git是目前世界上最先进的 分布式版本控制系统 版本控制系统:可以储存一个文件在不同时间的版本,记录 每次文件的改动,可以根据需要,随时 切换到之前的版本。 分布式…

    数据结构和算法 2023年6月12日
    099
  • P5501 [LnOI2019]来者不拒,去者不追 题解

    题面 首先进行一个转化:每个询问区间 ([l,r]) 中一对 ((i,j)),如果 (a_i< a_j) 会造成 (a_i) 的贡献。最后再加一个区间和就是答案。 考虑这是一…

    数据结构和算法 2023年6月12日
    065
  • 动态规划心得总结

    1.1. 常规情况的基本步骤 1.2. 给出递推函数的定义 & 找出递推关系 基本步骤中的第一步、第二步是紧密关联的。递推函数定义的不同会导致递推关系不同,甚至决定了在这种…

    数据结构和算法 2023年6月10日
    063
  • 线性DP——子序列问题浅谈

    很多人都不理解为什么可以用 f i 表示一个最长上升子序列大小? 那么我们可以看一下这个”上升”二字这才是这种类型问题的重点——上升要求的是什么? 不就是单…

    数据结构和算法 2023年6月7日
    084
  • 洛谷 P3388 【模板】割点(割顶)

    题目背景 题目描述 给出一个 $n$ 个点,$m$ 条边的无向图,求图的割点。 输入格式 第一行输入两个正整数 $n,m$。 下面 $m$ 行每行输入两个正整数 $x,y$ 表示 …

    数据结构和算法 2023年6月8日
    068
  • CF1468H K and Medians 题解

    每次删数都会删恰好 (k-1) 个,所以删的数总个数必须是 (k-1) 的倍数。考虑最终状态,如果所有数左边不足 (\frac{k-1}{2}) 个删掉的数或右边不足 (\frac…

    数据结构和算法 2023年6月12日
    068
  • CF 793 div2 E 题解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    0114
  • 进击的前端!

    HTML <link rel=”shortcut icon” href=”../images/animal-track.png”> 代表网站图标 一组 radio na…

    数据结构和算法 2023年6月12日
    074
  • 括号匹配

    括号匹配 题目 题目链接 代码 #include #include #include #include using namespace std; string str; stack…

    数据结构和算法 2023年6月7日
    076
  • 「学习笔记」斜率优化dp

    「学习笔记」斜率优化dp 点击查看目录 「学习笔记」斜率优化dp 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路…

    数据结构和算法 2023年6月8日
    0132
  • Django中间件执行顺序

    中间件 Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式…

    数据结构和算法 2023年6月7日
    076
  • 粗粒度服务的执行时间统计算法实现及问题推广

    3.1 算法一:逐一合并算法 3.1.1 算法描述 如图3.我们先将所有的时间片段按照起始时刻排序,后面的处理过程即依次判定相邻两个时间片段的三种关系,并将统计时间进行合并,合并的…

    数据结构和算法 2023年6月8日
    065
  • 区间dp

    一.什么是区间dp? 顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。 二.核心思路 既然让…

    数据结构和算法 2023年6月7日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球