《数据结构(A)》第3章作业

提醒同学:如果使用C++环境,则应该创建一个project来存放你的(这次作业)程序。如果数据结构定义与已实现的project相同,则一定的在已有的project之下实现,并要求:

(1)单独书写新的一个.h文件;

(2)一个题目程序书写成一个新的.cpp文件;

(3)修改(也可以认为是)main文件。

如果没有定义好数据结构,则要求重新建立一个新的project,以上3个文件都需要自己写。

学生作业仅提交.docx文件:包括题目、思路、代码与注释、以及测试情况及其分析等(格式按模板要求)。

1  基本作业题目

3.1  (《数据结构题集(C语言版)》,第3章,第3.9题,难度系数为3)试将下列递归过程改写为非递归过程。

  1. void test(int n){
  2.   int i;
  3.   i=n;
  4.   while (i>1)
  5.     Printf(i--);
  6. }

3.2  (《数据结构题集(C语言版)》,第3章,第24页,第3.19题,难度系数为4)假设一个算术表达式中可以包含3种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

2  基本作业题目解答

【3.1题解答】

思路:每输出一个数后,再次调用递归函数,打印输出下一个数字

运行结果截图:

 代码实现:

#include <stdio.h>
void recursion(int n) {
  if (n > 1) {
    printf("%d ", n);
    recursion(n - 1);
  }
}

int main() {
  recursion(10);
  return 0;
}

【3.2题解答】

思路:

用户输入数据,如果是左括号、左中括号、左花括号则存入栈中,如果是右括号、右中括号、右花括号,进行判断,如果该括号可以和栈顶元素即相应的左括号进行匹配,则将顶部元素出栈;如果不匹配则直接返回括号匹配不合法。当所有输入完成时,如果当前栈为空,则返回匹配合法。

结果:

源代码:

main.c

#include "Chapter3_2.h"
int main() {
  printf("Please input string:\n");//用户输入括号运算符
  Matching();//对输入的括号进行匹配
  return 0;
}

Chapter3_2.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCRENMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int SElemType;
typedef struct {
  int* base;
  int* top;
  int stacksize;
}Sqstack;
Status InitStack(Sqstack* S); //初始化一个顺序栈
Status Push(Sqstack* S, SElemType e); //在栈顶插元素
Status Pop(Sqstack* S, SElemType* e); //将栈顶元素弹出
Status StackEmpty(Sqstack S); //判断栈是否为空
Status GetTop(Sqstack S, SElemType* e); //获取栈顶元素
Status StackClear(Sqstack* S); //清空栈
Status Matching();//括号的匹配

Chapter3_2.c


#include "Chapter3_2.h"
Status InitStack(Sqstack* S) {
  S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
  if (!S->base) {
    exit(-1);
  }
  S->top = S->base;
  S->stacksize = STACK_INIT_SIZE; 
  return OK;
}
Status Push(Sqstack* S, SElemType e) {
  if (S->top - S->base >= S->stacksize) {
    S->base =(SElemType*)realloc(S->base,(S->stacksize +STACKINCRENMENT) 
      * sizeof(SElemType)); //栈的空间不够,重新分配空间
    if (!S->base)
      exit(-1);
    S->top = S->base + S->stacksize;
    S->stacksize += STACKINCRENMENT;
  }
  *S->top = e; //*S->top++ = e;
  S->top++;
  return OK;
}

Status Pop(Sqstack* S, SElemType* e) {
  //若栈不空,则删除栈顶元素,用e值带回
  if (S->base == S->top)
    return ERROR;
  --S->top;//e=*--S->top
  e = S->top;
}

Status StackEmpty(Sqstack S) {
  if (S.top == S.base)
    return TRUE;
}

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

Status StackClear(Sqstack* S) {
  S->top = S->base;
  return OK;
}

Status Matching() {
  //括号匹配检测
  Sqstack S;
  InitStack(&S);
  char ch, e;
  int state = 1;
  while ((ch = getchar()) != '\n'&&state)
  {//如果输入左括号,入栈;如果输入右括号,则与栈顶元素进行比较
    switch (ch) {
    case '(': {  Push(&S, ch); break;  }
    case ')': {  if (!StackEmpty(S) && GetTop(S, &e) == "(")
      Pop(&S, e);
            else { state = 0; break; }
    }
    case '{': {  Push(&S, ch); break; }
    case '}': {  if (!StackEmpty(S) && GetTop(S, &e) == "{")
      Pop(&S, e);
            else { state = 0; break; }
    }
    case '[': {  Push(&S, ch); break; }
    case ']': {  if (!StackEmpty(S) && GetTop(S, &e) == "[")
      Pop(&S, e);
            else { state = 0; break; }
    }
    }
  }
  if (StackEmpty(S) && state)
    printf("Success");//括号匹配成功,输出“Success”
  else printf("Failure");//括号匹配失败,输出“Failure”
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值