当前位置: 首页 > article >正文

数据结构-实验四(栈与字符串)

1.利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。

#include "seqstack.h"
/*请将本函数补充完整,并进行测试*/
void Dto16(int m)
{   seqstack s;			/*定义顺序栈*/
    init(&s);
    printf("十进制数%u对应的十六进制数是:",m);
    while (m)
    {
        push(&s,m%16);
        m/=16;
    }
    while (!empty(&s))
                putchar(  read(&s)<10? pop(&s)+48: pop(&s)+55   );
    printf("\n");
}
int main()
{    int m;
     printf("请输入待转换的十进制数:\n");
     scanf("%u",&m);
     Dto16(m);
     return 0;
}

 2.利用链式栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。

#include "linkstack.h"
/*请将本函数补充完整,并进行测试*/
void Dto16(unsigned int m)
{
    linkstack s;
    s=init();
    printf("十进制数%u对应的十六进制数是:",m);
    while (m)
    {
        s=push(s,m%16);
        m/=16;
    }
    while (!empty(s))
               {
                        printf("%x", read(s));
                        s=pop(s);
               }
    printf("\n");
}
int main()
{
        unsigned int m;
        printf("请输入待转换的十进制数:\n");
        scanf("%u",&m);
        Dto16(m);
        return 0;
}

 3.判断是否为运算符,判断运算符的优先级 ,缀表达式,转换为后缀表达式,将数字字符串转变成数值 , 后缀表达式求值程序。

#include <stdio.h>
#include "stack.h"  /*引入自定义的字符栈结构*/
/**********************/
/* 判断是否为运算符   */
/*********************/
int is_op(char op)
 {
   switch(op)
  { case '+':
    case '-':
    case '*':
    case '/':return 1;
    default:return 0;
    }
 }
/****************************/
/*   判断运算符的优先级     */
/****************************/
int priority(char op)
   {
     switch(op)
       {
          case '(':return 0;
          case '+':
          case '-':return 1;
          case '*':
          case '/':return 2;
	    default: return -1;
        }
  }
/*********************************/
/*中缀表达式,转换为后缀表达式   */
/*********************************/
void postfix(char e[],char f[])
 {seqstack opst;
  int i,j;
  initstack(&opst);
  push(&opst,'\0');
  i=j=0;
  while (e[i]!='\0')
   { if ((e[i]>='0' && e[i]<='9') || e[i]=='.')
           f[j++]=e[i];                     /*数字*/
      else if (e[i]=='(')                /*左括号*/
               push(&opst,e[i]);
           else if (e[i]==')')           /*右括号*/
              { while (stacktop(&opst)!='(')
                        f[j++]=pop(&opst);
                  pop(&opst);            /*'('出栈*/
               }
           else if (is_op(e[i]))         /* '+ ,-, *, /' */
                  {f[j++]=' ';           /*用空格分开两个操作数*/
                   while (priority(stacktop(&opst))>=priority(e[i]))
                       f[j++]=pop(&opst);

                   push(&opst,e[i]);     /*当前元进栈*/
                   }
       i++;  /*处理下一元*/
    }

    while (!stackempty(&opst))
        f[j++]=pop(&opst);
    f[j]='\0';
  }
/****************************************/
/*    将数字字符串转变成数值            */
/****************************************/
float readnumber(char f[],int *i)
  {float x=0.0;
   int k=0;
   while (f[*i]>='0' && f[*i]<='9') /*处理整数部分*/
   {
       x=x*10+(f[*i]-'0');
        (*i)++;
   }
   if (f[*i]=='.') /*处理小数部分*/
       {  (*i)++;
            while (f[*i]>='0' && f[*i]<='9')
                    {   x=x*10+(f[*i]-'0');
                        (*i)++;
                        k++;
                    }
      }
  while (k!=0)
    {       x=x/10.0;
            k=k-1;
    }
    printf("\n*%f*",x);
    return(x);
}
/****************************************/
/*         后缀表达式求值程序           */
/****************************************/
double  evalpost(char f[])
  {  double   obst[50]; /*操作数栈*/
      int i=0,top=-1;
     /*请将本函数补充完整*/
     double  x;
     while (f[i]!='\0')
       {
            if (f[i]>='0' && f[i]<='9')
	              obst[++top]=readnumber(f,&i);
	         else if (f[i]==' ')  i++;
                  else if (f[i]=='+')
                            {       x=obst[top--];
                                    obst[top]=x+obst[top];
                                    i++;
                            }
                        else    if (f[i]=='-')
                                    {   x=obst[top--];
                                        obst[top]=obst[top]-x;
                                        i++;
                                    }
                                else        if (f[i]=='*')
                                        {           x=obst[top--];
                                                    obst[top]=obst[top]*x;
                                                    i++;
                                        }
                                else if (f[i]=='/')
                                            {   x=obst[top--];
                                                obst[top]=obst[top]/x;
                                                 i++;
                                            }
                            }
                    return obst[top];
   }
/*
主程序:输入中缀表达式,经转换后输出后缀表达式
*/
int main()
 {
        char e[50],f[50];
        int i,j;
        printf("\n\n请输入中缀表达式:\n");
        gets(e);
        postfix(e,f);
        i=0;
        printf("\n\n对应的后缀表达式为: [");
        while (f[i]!='\0')
                printf("%c",f[i++]);
        printf("]");
        printf("\n\n计算结果为 :");
        printf("\n\n%f",evalpost(f));
        return 0;
}

 4.已知字符串采用带结点的链式存储结构(详见linksrting.h文件),请编写函数linkstring substring(linkstring s,int i,int len),在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表。

 

*/#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
linkstring substring(linkstring  s, int i, int len)
{
        linkstring head,r,q,p;
        int k=1;
        head=r=(linkstring)malloc(sizeof(linknode));
        r->next=NULL;
        p=s->next;
        while (p && k<i)            //找子串起点
        {
            p=p->next;
            k++;
        }
 if (!p) return head;        //起点超过链表长度
        else
        {
            k=1;
            while (p && k<=len)         //生成子串链表
            {
                q=(linkstring)malloc(sizeof(linknode));
                q->data=p->data;
                r->next=q;
                r=q;
                p=p->next;
                k++;
            }
            r->next=NULL;
            return head;
        }
}
int main()
{   linkstring str1,str2;
    str1=creat();                  /*建字符串链表*/
    print(str1);
    str2=substring(str1,3,5);    /*测试,从第3个位置开始取长度为5的子串,请自行构造不同测试用例*/
    print(str2);                   /*输出子串*/
    delList(str1);
    delList(str2);
    return 0;
}


http://www.kler.cn/a/399885.html

相关文章:

  • Ubuntu安装配置MySQL(远程登录)
  • 小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现
  • 使用nossl模式连接MySQL数据库详解
  • 基于语法树的SQL自动改写工具开发系列(2)-使用PYTHON进行简单SQL改写的开发实战
  • 计算机组成与原理(2) basic of computer architecture
  • 已解决:spark代码中sqlContext.createDataframe空指针异常
  • SpringMVC域对象共享数据
  • 新版自助笔记-工作记录-2024-11-18
  • 云安全之云计算基础
  • 【Linux】实现一个简易的进程池
  • 中国省级金融发展水平指数(金融机构存款余额、贷款余额、GDP)2020-2023年
  • 整理:4篇专注于多模态大语言模型(MLLM)的瘦身变体论文
  • 一文说清:c++标准库
  • 电脑msvcr100.dll丢失的解决方法,详细介绍多个解决方法
  • 上市公司企业研发操纵数据集(2008-2023年)
  • 【鸿蒙开发】第十五章 H5与端侧交互、Cookies以及Web调试
  • Video Duplicate Finder 快速识别并去除重复的视频和图像!
  • 大数据算法:三、梯度下降
  • Linux 中怎样把正在执行的任务放到后台执行
  • vue3 路由写法及传参方式 !超详细
  • 开源物业管理系统助力智能社区提升服务效率与用户体验
  • 基于Java Springboot北工国际健身俱乐部系统
  • 数据结构哈希表-(开放地址法+二次探测法解决哈希冲突)(创建+删除+插入)+(C语言代码)
  • 用Rust TypeMap安全存储多种类型数据
  • 【知识科普】统一身份认证CAS
  • PGMP-练DAY26