栈的应用——逆序输出和括号匹配

1逆序输出

在栈所擅长解决的典型问题中,有一类具有以下特征:首先,虽有明确的算法,但其解答却以线性序列的形式给出;其次无论递归还是迭代实现,该序列都是依逆序计算书吃的。最后,输入和输出规模的不确定,难以实现确定盛放输出数据的容器大小。因其特有的“后进先出”特性及其在容量方面的自适应性,可使用栈来解决此类问题。

进制转换:

任给十进制整数n,将其转换为λ进制的表示形式。

void convert(stack<char>& S,_int64 n,int base){//十进制正整数n到base进制的转换(递归版)
    static char digit[]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};//新进制下的数位符号
    if(0<n){
        S.puch(digit[n%base]); //逆向记录当前最低位,再通过递归得到所有最低位
        convert(S,n/base,base);
    }
}//新进制下由高到低的各数位,自顶而下保存于栈S中

在计算结束后只需通过反复的出栈操作即可由高到低的将其顺序输出。

void convert(Stack<char>& S,_int64 n,int base){//十进制n到base进制的转换(迭代版)
    static char digit[]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};
    while(n>0){//由高到低,助益计算出新进制下的各数位
        int remainder=(int)(n%base);
        S.puch(digit[remainder]);//余数入栈
        n/=base;//n更新为其对base的除商
    }
}

原文地址:https://www.cnblogs.com/biwangwang/p/11332465.html

时间: 2024-08-11 04:24:18

栈的应用——逆序输出和括号匹配的相关文章

逆序输出一句话

对一句话里面的单词进行reverse,标点符号位置不变.符号包括:,.!? 例:输入:Hello, my dear friend! 输出:olleH, ym raed dneirf! 思路:由于需要逆序输出,因此想到利用栈数据结构来实现. 代码如下(调试环境:VS2013): 逆序输出一句话,布布扣,bubuko.com

java版的单向链表的逆序输出

将单向链表逆序输出,方法有三种: a.遍历链表,将每个节点的内容存入一个数组中,然后逆序输出数组(最简单的做法) b.使用栈来逆序输出 c.直接将链表逆序然后输出(本文采用的方法) 先介绍算法: 1). 若链表为空或只有一个元素,则直接返回: 2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继: 3). 重复2),直到q为空 4). 调整链表头和链表尾 示例:以逆序A->B->C->D为例,图示如下 package com.moluo.shujujiegou;

单链表逆序或者逆序输出

分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序. ********************逆序输出*********************** 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5 6 7 typedef struct node{ 8 int data; 9 node * next; 10 }node; 11 12 //

字符串逆序输出--递归

说到递归,很容易想到n!,斐波那契数列(数兔子问题),当然这些都是很好理解的问题.个人认为,最能反映递归实质的是汉诺塔和字符串逆向输出问题.汉诺塔问题只需要思考一步,其他难题就交给计算机吧,这很好的证明了递归就是懒人专用算法.仅凭这一点,就足以掩盖递归效率低下的缺陷.我们都知道,递归就是函数调用自身的过程.在c语言中,函数调用自身和调用其他函数,没有一点区别.都是保存现场,函数调用,恢复现场的过程,这是通俗的说法,用我们专业的术语来说,递归的实质就是入栈和出栈的过程.解释到这里,用递归实现字符串

如何实现一个高效的单向链表逆序输出?(详解)

需要考虑因素,高效应权衡多方面因素 数据量是否会很大 空间是否有限制 原始链表的结构是否可以更改 时间复杂度是否有限制 一个链表节点需要输出的元素有多个,例如链表中存的是自定义对象,有多个字段 题目. 01. 先学着实现一个简单的Java版的单项链表构建任意长度的任意数值的链表, 头插法,顺序遍历输出链表 package com.szs.list; /** * 单链表 * @author Administrator * */ public class MyLinkedList { public

1111 多个整数的逆序输出

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1111Description输入n和n个整数,以与输入顺序相反的顺序输出这n个整数.要求不使用数组,而使用递归函数实现.递归函数实现过程如下:void inverse(int n){    if(n >1)   {        (1) 读入一个整数,存入num;        (2)  将后面的n-1个数逆序输出: inverse(n-1);          (3)  输出num: 

字符串逆序输出

描述 给定一行字符,逆序输出此行(空格.数字不输出) 输入 第一行是一个整数N(N<10)表示测试数据的组数) 每组测试数据占一行,每行数据中间有且只有一个空格(这样你可以把此行当成两个字符串读取). 每行字符长度不超过40 并且保证输入的字符只有空格(1个),数字,小写字母三种 输出 对应每行测试数据,逆序输出(空格和数字不输出) 样例输入 3 abc 123de abc 123 abc d 样例输出 edcba cba dcba 1 #include <stdio.h> 2 #inc

题目550-三位数逆序输出-nyoj20140811

#include <stdio.h>int main(){    int m;    while(scanf("%d",&m)!=EOF)    {        int a1,a2,a3,sum,n;        a1=m%10;        n=(m-a1)/10;        a2=n%10;        a3=m/100;        sum=100*a1+a2*10+a3;        printf("%d\n",sum);

用递归实现字符串的逆序输出

/*输入一个字符串实现逆序输出*/ #include <stdio.h> #include <stdlib.h> void print() { char c; scanf("%c",&c); if(c != '#') print(); if(c != '#') printf("%c",c); } int main() { printf("请输入字符串,以#结束:\n"); print(); return 0; }