数据结构与算法——栈的实现与三种应用实例(C++)

本文介绍了如何使用C++实现栈,包括栈的实现以及三个应用实例:基于逆序输出的进制转换、基于递归嵌套的括号匹配和基于延迟缓冲的表达式求值。每个实例都展示了栈在解决问题中的关键作用。
摘要由CSDN通过智能技术生成

1 栈的实现

栈可以依托向量或者列表的类来实现,此处采用继承列表类的方法来实现,列表类的详情见class List

#include <string.h>
#include "../dsa_list_20200715/list.h"
template <typename T> class Stack:public List<T> {
   
public:
    void push ( T const& e ) {
    List<T>::insertAsLast( e );}//入栈
    T pop() {
    return List<T>::remove ( List<T>::last() );}          //出栈
    T& top() {
    return List<T>::last()->data; }             //取顶
};

2 主程序

主程序实现了栈的三种应用实例。这三种实例分别是基于逆序输出特性的进制转换实例,基于递归嵌套特性的括号匹配实例,和基于延迟缓冲特性的表达式求值实例。

#include <iostream>
#include <cmath>
#include "stack.h"
using namespace std;

#define N_OPTR 9
void convert ( Stack<char>& S, __int64 n, int base);//进制转换
bool paren ( const char exp[], int lo, int hi);//括号匹配
float evaluate(char* s);//表达式求值
float calcu(float popnd);//符号计算
float calcu( float op1, char op, float op2);
char orderBetween(char s1, char s2);//优先级判断
void readNum ( char*& p, Stack<float>& stk);//读入
// void append( char *&rpn, float opnd);//连接
// void append( char *&rpn, char optr);


//优先级表
typedef enum {
      //通过枚举给每一个运算符一个编号
	ADD, SUB, MUL, DIV, POW, FAC, L_P, R_P, EOE
} Operator;
const char pri[N_OPTR][N_OPTR] =          //运算符优先级表
{
   
	/*              |-------------------- 当 前 运 算 符 --------------------| */
	/*              +      -      *      /      ^      !      (      )      \0 */
	/* --  + */    '>',   '>',   '<',   '<',   '<',   '<',   '<',   '>',   '>',
	/* |   - */    '>',   '>',   '<',   '<',   '<',   '<',   '<',   '>',   '>',
	/* 栈  * */    '>',   '>',   '>',   '>',   '<',   '<',   '<',   '>',   '>',
	/* 顶  / */    '>',   '>',   '>',   '>',   '<',   '<',   '<',   '>',   '>',
	/* 运  ^ */    '>',   '>',   '>',   '>',   '>',   '<',   '<',   '>',   '>',
	/* 算  ! */    '>',   '>',   '>',   '>',   '>',   '>',   ' ',   '>',   '>',
	/* 符  ( */    '<',   '<',   '<',   '<',   '<'
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值