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 */
/* -- + */ '>', '>', '<', '<', '<', '<', '<', '>', '>',
/* | - */ '>', '>', '<', '<', '<', '<', '<', '>', '>',
/* 栈 * */ '>', '>', '>', '>', '<', '<', '<', '>', '>',
/* 顶 / */ '>', '>', '>', '>', '<', '<', '<', '>', '>',
/* 运 ^ */ '>', '>', '>', '>', '>', '<', '<', '>', '>',
/* 算 ! */ '>', '>', '>', '>', '>', '>', ' ', '>', '>',
/* 符 ( */ '<', '<', '<', '<', '<'