数据结构-栈的应用

数值转换


#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>//OVERFLOW
using namespace std;

//顺序栈
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define ERROR  0
#define OK 1
#define TRUE    1
#define FALSE   0
//typedef  int SElemType;//可以为int,char,……
typedef int SElemType;
typedef int Status;
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;//当前已分配的存储空间
}SqStack;

Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());

//构造一个空栈S
Status InitStack(SqStack &S) {
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status DestroyStack(SqStack &S){
    if(S.base ){
        free(S.base);
        S.base = NULL;
        S.top = NULL;
        S.stacksize = 0;
    }
    return OK;
}


Status ClearStack(SqStack &S){
    if(S.base){
        S.top = S.base;
    }
    return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack S) {
    if (S.top == S.base) return OK;
    else return ERROR;
}

int StackLength(SqStack S)
{
    return (S.top-S.base)/sizeof(SElemType);
}
//若栈不空,则用e返回栈顶元素,并返回ok(1),否则返回error(0)
Status GetTop(SqStack S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return OK;
}

//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
        S.base = (SElemType*)realloc(S.base,
                                     (S.stacksize + STACKINCREMENT) * sizeof(char));
        if (!S.base) exit(OVERFLOW);//存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *(S.top++) = e;
    return OK;
}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回ok,否则返回error
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(--S.top);
    return OK;
}

Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
    while(S.top > S.base)
        visit(*S.base++);
    printf("\n");
    return OK;
}

Status visit(SElemType e){
    printf("%c ", e);
    return OK;
}
//打印栈元素
void PrintStack(SqStack s) {
    if (StackEmpty(s)) return;
    printf("Stack:");
    while (!StackEmpty(s)){
        printf("%c ", *(s.top - 1));
        SElemType e;
        Pop(s, e);
    }
    printf("\n");
}

void conversion(){
    SqStack S;
    InitStack(S);
    SElemType e;
    int n, r;
    printf("输入一个数十进制数和想要转换的进制:\n");
    scanf("%d %d", &n, &r);
    while(n){
        Push(S, n%r);
        n/=r;
    }
    while(!StackEmpty(S)){
        Pop(S,e);
        printf("%d", e);
    }
    printf("\n");
}
//-----------------------

int main() {
    
    conversion();
    return 0;
}
1348 8
2504

括号匹配


#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>//OVERFLOW
using namespace std;

//顺序栈
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define ERROR  0
#define OK 1
#define TRUE    1
#define FALSE   0
//typedef  int SElemType;//可以为int,char,……
typedef char SElemType;
typedef char Status;
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;//当前已分配的存储空间
}SqStack;

Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());

//构造一个空栈S
Status InitStack(SqStack &S) {
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status DestroyStack(SqStack &S){
    if(S.base ){
        free(S.base);
        S.base = NULL;
        S.top = NULL;
        S.stacksize = 0;
    }
    return OK;
}


Status ClearStack(SqStack &S){
    if(S.base){
        S.top = S.base;
    }
    return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack S) {
    if (S.top == S.base) return OK;
    else return ERROR;
}

int StackLength(SqStack S)
{
    return (S.top-S.base)/sizeof(SElemType);
}


//若栈不空,则用e返回栈顶元素,并返回ok(1),否则返回error(0)
Status GetTop(SqStack S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return OK;
}

//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
        S.base = (SElemType*)realloc(S.base,
                                     (S.stacksize + STACKINCREMENT) * sizeof(char));
        if (!S.base) exit(OVERFLOW);//存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *(S.top++) = e;
    return OK;
}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回ok,否则返回error
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(--S.top);
    return OK;
}

Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
    while(S.top > S.base)
        visit(*S.base++);
    printf("\n");
    return OK;
}

Status visit(SElemType e){
    printf("%c ", e);
    return OK;
}


//打印栈元素
void PrintStack(SqStack s) {
    if (StackEmpty(s)) return;
    printf("Stack:");
    while (!StackEmpty(s)){
        printf("%c ", *(s.top - 1));
        SElemType e;
        Pop(s, e);
    }
    printf("\n");
}

void matchStr(){
    SqStack s;
    SElemType ch[80], *p, e;
    if(InitStack(s)){
        printf("请输入表达式:\n");
        gets(ch);
        p=ch;
        while(*p){ // 没到串尾
            switch(*p){
                case '(':
                case '[':
                case '{':
                    Push(s,*p++);
                    break;
                case ')':
                case ']':
                case '}':
                    if(!StackEmpty(s)) {
                        Pop(s,e);
                        // 弹出的栈顶元素与*p不配对
                        if((*p==')' && e!='(' )|| (*p==']'&& e!='[') ||(*p=='}' && e!='{')){
                            printf("左右括号不配对,匹配失败!\n");
                            exit(ERROR);
                        }
                        else p++;
                    } else {// 栈空
                        printf("缺乏左括号,匹配失败!\n");
                        exit(ERROR);
                    }
                    break;
                default:
                    p++; // 其它字符不处理,指针向后移
            }
        }
        //字符串结束时栈空
        if(StackEmpty(s))
            printf("括号匹配成功!\n");
        else
            printf("缺乏右括号,匹配失败!\n");
    }
}

int main() {
    matchStr();  //SElemtype = char;
    //conversion();
    return 0;
}


()[{458(0-{}[])}]

行编辑程序

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>//OVERFLOW
using namespace std;

//顺序栈
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define ERROR  0
#define OK 1
#define TRUE    1
#define FALSE   0
//typedef  int SElemType;//可以为int,char,……
typedef char SElemType;
typedef char Status;
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;//当前已分配的存储空间
}SqStack;

Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());

//构造一个空栈S
Status InitStack(SqStack &S) {
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status DestroyStack(SqStack &S){
    if(S.base ){
        free(S.base);
        S.base = NULL;
        S.top = NULL;
        S.stacksize = 0;
    }
    return OK;
}


Status ClearStack(SqStack &S){
    if(S.base){
        S.top = S.base;
    }
    return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack S) {
    if (S.top == S.base) return OK;
    else return ERROR;
}

int StackLength(SqStack S)
{
    return (S.top-S.base)/sizeof(SElemType);
}

//若栈不空,则用e返回栈顶元素,并返回ok(1),否则返回error(0)
Status GetTop(SqStack S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return OK;
}

//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
        S.base = (SElemType*)realloc(S.base,
                                     (S.stacksize + STACKINCREMENT) * sizeof(char));
        if (!S.base) exit(OVERFLOW);//存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *(S.top++) = e;
    return OK;
}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回ok,否则返回error
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(--S.top);
    return OK;
}

Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
    while(S.top > S.base)
        visit(*S.base++);
    printf("\n");
    return OK;
}

Status visit(SElemType e){
    printf("%c ", e);
    return OK;
}

//打印栈元素
void PrintStack(SqStack s) {
    if (StackEmpty(s)) return;
    printf("Stack:");
    while (!StackEmpty(s)){
        printf("%c ", *(s.top - 1));
        SElemType e;
        Pop(s, e);
    }
    printf("\n");
}

void LineEdit(){
    SqStack S;
    InitStack(S);
    SElemType ch,c;
    while((ch=getchar())!=EOF){
        while(ch!=EOF && ch!='\n'){
            switch(ch){
                case '#':
                    Pop(S, c);
                    break;
                case '@':
                    ClearStack(S);
                    break;
                default:
                    Push(S, ch);
                    break;
            }
            ch=getchar();
        }
        StackTraverse(S, visit);
        ClearStack(S);
        if(ch!=EOF) ch=getchar();
    }
    DestroyStack(S);
}

int main() {
    LineEdit();
    return 0;
}
  whli##ilr#e(a#*s)
  			outcha@putchar(*s=#++)

表达式转换

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>//OVERFLOW
using namespace std;

//顺序栈
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define ERROR  0
#define OK 1
#define TRUE    1
#define FALSE   0
//typedef  int SElemType;//可以为int,char,……
typedef int SElemType;
typedef int Status;
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;//当前已分配的存储空间
}SqStack;

Status InitStack(SqStack &S);
Status DestroyStack(SqStack &S);
Status ClearStack(SqStack &S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S, SElemType &e);
Status Push(SqStack &S, SElemType e);
Status Pop(SqStack &S, SElemType &e);
Status StackTraverse(SqStack S, Status(*visit)());

//构造一个空栈S
Status InitStack(SqStack &S) {
    S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(char));
    if (!S.base) exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

Status DestroyStack(SqStack &S){
    if(S.base ){
        free(S.base);
        S.base = NULL;
        S.top = NULL;
        S.stacksize = 0;
    }
    return OK;
}


Status ClearStack(SqStack &S){
    if(S.base){
        S.top = S.base;
    }
    return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack S) {
    if (S.top == S.base) return OK;
    else return ERROR;
}

int StackLength(SqStack S)
{
    return (S.top-S.base)/sizeof(SElemType);
}
//若栈不空,则用e返回栈顶元素,并返回ok(1),否则返回error(0)
Status GetTop(SqStack S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return OK;
}

//插入元素e为新的栈顶元素
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
        S.base = (SElemType*)realloc(S.base,
                                     (S.stacksize + STACKINCREMENT) * sizeof(char));
        if (!S.base) exit(OVERFLOW);//存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *(S.top++) = e;
    return OK;
}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回ok,否则返回error
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) return ERROR;
    e = *(--S.top);
    return OK;
}

Status StackTraverse(SqStack S, Status(* visit)(SElemType)){
    while(S.top > S.base)
        visit(*S.base++);
    printf("\n");
    return OK;
}

Status visit(SElemType e){
    printf("%c ", e);
    return OK;
}
//打印栈元素
void PrintStack(SqStack s) {
    if (StackEmpty(s)) return;
    printf("Stack:");
    while (!StackEmpty(s)){
        printf("%c ", *(s.top - 1));
        SElemType e;
        Pop(s, e);
    }
    printf("\n");
}

int EvaluateExpression();

char OP[7] = {'+', '-', '*', '/', '(', ')','#'};
int main(){
    printf("Expression =  %d\n",EvaluateExpression());
    return 0;
}

//判断c是否再OP中
Status In(char c, char* OP){
    for(unsigned int i = 0 ; i < strlen(OP);  ++i){
        if(*(OP + i) == c) return TRUE;
    }
    return FALSE;
}

//返回优先级情况
char Precede(char a, char b){
    int i,j;
    //优先级表
    char pre[][7]={
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=',' '},
        {'>','>','>','>',' ','>','>'},
        {'<','<','<','<','<',' ','='}};
    switch(a){
        case '+': i = 0; break;
        case '-': i = 1; break;
        case '*': i = 2; break;
        case '/': i = 3; break;
        case '(': i = 4; break;
        case ')': i = 5; break;
        case '#': i = 6; break;
    }
    switch(b){
        case '+': j = 0; break;
        case '-': j = 1; break;
        case '*': j = 2; break;
        case '/': j = 3; break;
        case '(': j = 4; break;
        case ')': j = 5; break;
        case '#': j = 6; break;
    }
    return pre[i][j];
}

//二元运算
int Operate(int a, char op, int b){
    int result;
    switch(op){
        case '+': result = a + b; break;
        case '-': result = a - b; break;
        case '*': result = a * b; break;
        case '/': result = a / b; break;
    }
    return result;
}

//跳过空格读取字符
char getcharwithoutspace(){
    char c;
    while((c=getchar())==' ');
    return c;
}

int EvaluateExpression(){
    //定义两种类型的栈
    SqStack OPND;
    SqStack OPTR;
    InitStack(OPTR);
    InitStack(OPND);
    //'#'作为栈底元素
    Push(OPTR, '#');
    //输入
    char c = getcharwithoutspace();
    //获得栈顶元素
    SElemType e;
    GetTop(OPTR, e);
    //进行运算直至读取到#且栈内无其余操作符后退出
    while((c != '#') || (e != '#')){
        //若不是运算符,则入栈
        if(!In(c, OP)){
            int n = 0;
            do{
                //输入的字符 -> 数字
                n = n * 10 + (c - '0');
                c = getcharwithoutspace();
            }while(!In(c, OP));
            Push(OPND, n);
        }else{
            //如果输入的是运算符,则和栈顶的运算符比较优先级
            GetTop(OPTR, e);
            switch(Precede(e, c)){
                    //栈顶元素优先级低
                case '<':
                    Push(OPTR, c);
                    c = getcharwithoutspace();
                    break;
                    //脱去括号并接受下一个字符
                case '=':
                    Pop(OPTR, e);
                    c = getcharwithoutspace();
                    break;
                    //退栈并将运算结果入栈
                case '>':
                    SElemType theta;
                    int b, a;
                    Pop(OPTR, theta);
                    Pop(OPND, b);
                    Pop(OPND, a);
                    Push(OPND, Operate(a, theta, b));
                    break;
                    /*test
                     default:
                     printf("??????");
                     break;
                     */
            }
        }
        //获取栈顶运算符
        GetTop(OPTR, e);
    }
    int result;
    //获取结果
    GetTop(OPND, result);
    return result;
}
4+2*3-10/5#
Expression =  8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值