文章目录

  • 汉诺塔
  • 3.3.1 顺序栈的实现
  • 3.3.2 链栈的实现
  • 3.5.2 循环队列——队列的顺序表示和实现
  • 3.5.3 链队——队列的链式表示和实现
  • 案例3.1 数值转换
  • 案例3.2 括号匹配的检测
  • 算法设计题
    • 第一题
    • 第二题
    • 第三题
    • 第四题
    • 第五题
    • 第六题

汉诺塔

#include<stdio.h>static int m = 0;void move(char A, int n, char C)
{printf("%d, %d, %c, %c\n", ++m, n, A, C);
}void Hanoi(int n, char A, char B, char C)
{if(n == 1){move(A, 1, C);}else{Hanoi(n-1, A, C, B);move(A, n, C);Hanoi(n-1, B, A, C);}
}int main(void)
{Hanoi(10, 'A', 'B', 'C');return 0;
}

3.3.1 顺序栈的实现

#include<stdio.h>
#include<stdlib.h>
#define SElemType int
#define MAX 100000typedef struct
{SElemType *base;SElemType *top;int stacksize;int lenth;
}SqStack;void InitStack(SqStack *S, int size)
{S->base = (SElemType *)malloc(size * sizeof(SElemType));if(!S->base){exit(1);}S->top = S->base;S->stacksize = size;S->lenth = 0;printf("初始化栈成功!\n\n");return;
}void DestoryStack(SqStack *S)
{if(S->base){SElemType *p;p = S->base;free(p);S->top = S->base = NULL;S->lenth = S->stacksize = 0;printf("销毁成功\n");}
}void ClearStack(SqStack *S)
{if(S->top > S->base){S->top = S->base;S->lenth = 0;}return;
}int StackEmpty(SqStack S)
{if(S.top > S.base){return 1;}return 0;
}void Push(SqStack *S, SElemType e)
{if(S->top - S->base == S->stacksize){exit(2);}*(S->top) = e;(S->top)++;S->lenth++;printf("元素 %d 压入栈\n\n", e);return;
}void Pop(SqStack *S, SElemType *e)
{if(S->top == S->base){exit(3);}(S->top)--;*e = *(S->top);S->lenth--;printf("弹出元素 %d ", *(S->top));return;
}SElemType GetTop(SqStack S)
{if(S.top != S.base){return *(S.top - 1);}return MAX;
}void ShowStack(SqStack S)
{printf("栈为:");for(int i = 0;i < S.lenth; i++){printf(" %d ", S.base[i]);}printf("\n\n");
}int main(void)
{SqStack S;SElemType e;InitStack(&S, 10);
//  DestoryStack(&S);printf("%d",S.lenth);Push(&S, 1);Push(&S, 2);
//  ShowStack(S);
//  Pop(&S, &e);
//  printf("%d\n", e);printf("%d\n", GetTop(S));ClearStack(&S);printf("%d\n", S.lenth);return 0;
}

3.3.2 链栈的实现

#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define MAX 100000typedef struct StackNode
{ElemType data;struct StackNode *next;
}StackNode, *LinkStack;void InitStack(LinkStack *S)
{*S = NULL;printf("链栈初始化成功\n\n");return;
}void Push(LinkStack *S, ElemType e)
{LinkStack p;p = (StackNode *)malloc(sizeof(StackNode));p->data = e;p->next = *S;*S = p;printf("栈顶压入 %d\n\n", e);return;
}void Pop(LinkStack *S, ElemType *e)
{LinkStack p = *S;if(p == NULL){exit(1);}*e = p->data;*S = (*S)->next;printf("栈顶弹出 %d\n\n", *e);free(p);return;
}ElemType GetTop(LinkStack S)
{if(S != NULL){return S->data;}return MAX;
}void TraverseList(LinkStack p)     //递归打印栈元素
{if(p){printf("%d\n", p->data);TraverseList(p->next);}
}int main(void)
{LinkStack S;ElemType e;InitStack(&S);Push(&S, 1);Push(&S, 2);Push(&S, 3);Push(&S, 4);TraverseList(S);printf("%d\n\n", GetTop(S));Pop(&S, &e);return 0;
}

3.5.2 循环队列——队列的顺序表示和实现

#include<stdio.h>
#include<stdlib.h>#define MAXQSIZE 101
#define ElemType chartypedef struct
{ElemType *base;int front;      //指示队头,相当于栈底int rear;       //指示队尾,相当于栈顶
}SqQueue;void InitQueue(SqQueue *Q)     //构造一个空队
{Q->base = (ElemType *)malloc(MAXQSIZE * sizeof(ElemType));if(!Q->base){exit(1);}Q->front = Q->rear = 0;printf("队列初始化成功\n\n");return;
}void DestoryQueue(SqQueue *Q)
{if(Q->base){Q->front = Q->rear = -1;free(Q->base);printf("队列销毁成功!\n\n");}return;
}void ClearQueue(SqQueue *Q)
{if(Q->base){Q->front = Q->rear = 0;}printf("队列已清空\n\n");return;
}int QueueEmpty(SqQueue Q)
{if(Q.front == Q.rear){printf("队列为空\n\n");return 0;}else{printf("队列非空\n\n");return 1;}
}int QueueLength(SqQueue Q)
{return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}void EnQueue(SqQueue *Q, ElemType e)       //入队
{if((Q->rear + 1)%MAXQSIZE == Q->front){exit(2);}(Q->base)[Q->rear] = e;Q->rear = (Q->rear + 1) % MAXQSIZE;printf("%c 元素入队\n\n", e);return;
}void DeQueue(SqQueue *Q, ElemType *e)      //出队
{if(Q->front == Q->rear)            //队空{exit(3);}*e = (Q->base)[Q->front];Q->front = (Q->front + 1) % MAXQSIZE;printf("%c 元素出队\n\n", *e);return;
}ElemType GetHead(SqQueue Q)
{if(Q.front != Q.rear){return Q.base[Q.front];}
}void QueueTraverse(SqQueue Q)
{if(Q.front == Q.rear){printf("队列为空\n\n");return;}printf("队列元素为:");for(int i = Q.front;i <= Q.rear; i++){printf(" %c",Q.base[i % MAXQSIZE]);}return;
}int main(void)
{SqQueue Q1;ElemType e;InitQueue(&Q1);printf("%d\n", QueueLength(Q1));EnQueue(&Q1, 'a');printf("%d\n", QueueLength(Q1));DeQueue(&Q1, &e);printf("%c\n\n", e);return 0;
}

3.5.3 链队——队列的链式表示和实现

ps:打印队列未实现,按照之前代码改改难度应该不大

#include<stdio.h>
#include<stdlib.h>#define ElemType chartypedef struct QNode
{ElemType data;struct QNode *next;
}QNode, *QueuePtr;typedef struct
{QueuePtr front;QueuePtr rear;
}LinkQueue;void InitQueue(LinkQueue *Q)
{QNode *H;H = (QNode *)malloc(sizeof(QNode));Q->front = H;Q->rear = H;
//  printf("%p\n%x\n\n",Q->front, Q->rear);Q->front->next = NULL;printf("链队初始化成功!\n\n");return;
}void ClearQueue(LinkQueue *Q)
{if((Q->front) == (Q->rear)){printf("释放失败,队列为空!\n");return;}    while(Q->front != Q->rear){QueuePtr p = Q->front->next;   //将所有元素出队并释放空间Q->front->next = p->next;if(Q->rear == p){Q->rear = Q->front;           //最后一个元素被删,队尾指针指向头节点}free(p);        }return;
}void DestroyQueue(LinkQueue *Q)
{ClearQueue(Q);QueuePtr p = Q->front;Q->front = Q->rear = NULL;free(p);                         //释放头节点的空间,完成销毁printf("销毁成功!\n\n");
}int QueueEmpty(LinkQueue Q)
{if(Q.front != Q.rear){printf("队列非空!\n\n");return 1;}else{printf("队列为空!\n\n");return 0;}
}int QueueLength(LinkQueue Q)
{QueuePtr p = Q.front->next;int i = 1;while(p){p = p->next;i++;}return i;
}void EnQueue(LinkQueue *Q, ElemType e)
{QueuePtr p;p = (QNode *)malloc(sizeof(QNode));p->data = e;p->next = NULL;Q->rear->next = p;Q->rear = p;printf("%c 元素入队成功!\n\n", e);return;
}void DeQueue(LinkQueue *Q, ElemType *e)
{if((Q->front) == (Q->rear)){printf("出队失败,队列为空!\n");return;}QueuePtr p = Q->front->next; //首元*e = p->data;Q->front->next = p->next;if(Q->rear == p){Q->rear = Q->front;            //最后一个元素被删,队尾指针指向头节点}free(p);printf("%c 元素出队成功!\n\n",*e);return;
}ElemType GetHead(LinkQueue Q)
{if(Q.front != Q.rear){printf("队头元素为 %c\n\n",Q.front->next->data);return Q.front->next->data;}printf("队列为空!\n\n");
}int main(void)
{LinkQueue que;ElemType e;InitQueue(&que);EnQueue(&que, 'q');DestroyQueue(&que);GetHead(que);
//  DeQueue(&que, &e);
//  GetHead(que);return 0;
}

案例3.1 数值转换

ps:借助了顺序栈的一些函数

void conversion(int N)
{SqStack S;SElemType e;InitStack(&S, 1000);while(N){Push(&S, N%8);N /= 8;}while(StackEmpty(S)){Pop(&S,&e);}return;
}

案例3.2 括号匹配的检测

#include<stdio.h>
#include<stdlib.h>
#define SElemType char
#define MAX 100000typedef struct
{SElemType *base;SElemType *top;int stacksize;int lenth;
}SqStack;void InitStack(SqStack *S, int size)
{S->base = (SElemType *)malloc(size * sizeof(SElemType));if(!S->base){exit(1);}S->top = S->base;S->stacksize = size;S->lenth = 0;printf("初始化栈成功!\n\n");return;
}void DestoryStack(SqStack *S)
{if(S->base){SElemType *p;p = S->base;free(p);S->top = S->base = NULL;S->lenth = S->stacksize = 0;printf("销毁成功\n");}
}void ClearStack(SqStack *S)
{if(S->top > S->base){S->top = S->base;S->lenth = 0;}return;
}int StackEmpty(SqStack S)
{if(S.top > S.base){return 1;}return 0;
}void Push(SqStack *S, SElemType e)
{if(S->top - S->base == S->stacksize){exit(2);}*(S->top) = e;(S->top)++;S->lenth++;printf("元素 %c 压入栈\n\n", e);return;
}void Pop(SqStack *S, SElemType *e)
{if(S->top == S->base){exit(3);}(S->top)--;*e = *(S->top);S->lenth--;printf("弹出元素 %c \n\n", *(S->top));return;
}SElemType GetTop(SqStack S)
{if(S.top != S.base){return *(S.top - 1);}//return MAX;
}void ShowStack(SqStack S)
{printf("栈为:");for(int i = 0;i < S.lenth; i++){printf(" %c ", S.base[i]);}printf("\n\n");
}void Matching(void)
{//表达式以“#”开始和结束SqStack S;InitStack(&S, 200);int flag = 1;char ch = getchar();while(ch != '#' && flag){SElemType e;switch (ch){case '{':case '(':case '<':case '[':Push(&S, ch);break;case '}':if(StackEmpty(S) && GetTop(S) == '{'){Pop(&S, &e);}else flag = 0;break;case ')':if(StackEmpty(S) && GetTop(S) == '('){Pop(&S, &e);}else flag = 0;break;case '>':if(StackEmpty(S) && GetTop(S) == '<'){SElemType e;Pop(&S, &e);}else flag = 0;break;case ']':if(StackEmpty(S) && GetTop(S) == '['){SElemType e;Pop(&S, &e);}else flag = 0;break;default:break;}ch = getchar();}if(!StackEmpty(S) && flag){printf("匹配成功!");}elseprintf("匹配失败!");
}int main(void)
{Matching();return 0;
}

表达式求值和舞伴问题因为要补大量代码,等博主有空再说。

算法设计题

第一题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SElemType char#define LEFT 1
#define RIGHT -1
#define ALL 2typedef struct
{int top[2], bot[2];SElemType *V;int m;
}DblStack;void InitDblStack(DblStack *Db, int size)
{//初始化双栈if(Db->bot[0] != -1)    //若未初始化{Db->m = size;Db->V = (SElemType *)malloc(size * sizeof(SElemType));if(!(Db->V)){printf("内存分配失败!\n");exit(1);}Db->top[0] = Db->bot[0] = -1;Db->bot[1] = Db->top[1] = size;printf("初始化成功!\n");}else{printf("请勿重复初始化!\n");}
}int IsEmptyDbl(DblStack Db)
{if(Db.bot[0] != -1) {printf("未初始化\n");exit(2);}return (Db.top[0] + 1 +Db.bot[1] - Db.top[1]);//双栈元素个数
}int IsFullDbl(DblStack Db)
{if(Db.bot[0] != -1) {printf("未初始化\n");exit(2);}return (Db.top[1]-Db.top[0]-1);
}void push(DblStack *Stack, int mode, SElemType e)
{if(Stack->bot[0] != -1) {printf("未初始化\n");exit(2);}if(!IsFullDbl(*Stack)){printf("数组已满,压入失败\n");return;}switch (mode){case LEFT:Stack->top[0]++;Stack->V[Stack->top[0]] = e;printf("向左侧压入%c\n",e);break;case RIGHT:Stack->top[1]--;Stack->V[Stack->top[1]] = e;printf("向右侧压入%c\n",e);break;default:printf("mode参数传入错误!\n");break;}
}void pop(DblStack *Stack, int mode, SElemType *e)
{if(Stack->bot[0] != -1) {printf("未初始化\n");exit(2);}switch (mode){case LEFT:if(Stack->top[0] == Stack->bot[0]){printf("数组为空,弹出失败\n");return;}else{*e = Stack->V[Stack->top[0]];printf("左侧弹出%c\n", *e);Stack->top[0]--;}break;case RIGHT:if(Stack->top[1] == Stack->bot[1]){printf("数组为空,弹出失败\n");return;}else{*e = Stack->V[Stack->top[1]];printf("右侧弹出%c\n", *e);Stack->top[1]--;}break;case ALL:if(Stack->top[0] == Stack->bot[0] || Stack->top[1] == Stack->bot[1]){printf("数组为空,弹出失败\n");return;}else{*e = Stack->V[Stack->top[0]];printf("左侧弹出%c\n", *e);Stack->top[0]--;printf("右侧丢失%c\n", Stack->V[Stack->top[1]]);Stack->top[1]--;}break;default:printf("mode参数传入错误!\n");break;}return;
}int main(void)
{DblStack test;SElemType e;InitDblStack(&test, 30);InitDblStack(&test, 30);push(&test, LEFT, 'a');pop(&test, LEFT, &e);printf("%d", IsFullDbl(test));return 0;
}

第二题

//基于线性栈
int palindrome(char *ch)
{SqStack S;SElemType e;InitStack(&S, 10);int flag = 0;if(strlen(ch) % 2){flag = 1;}for(int i = 0;i < strlen(ch); i++){Push(&S, ch[i]);}for(int i = 0;i < strlen(ch); i++){Pop(&S, &e);if(e != ch[strlen(ch) + i + flag]){printf("%s 不是回文串", ch);return 0;}}printf("%s 是回文串", ch);return 1;
}void PalindromeTest(void)
{char *a = "xiehuichaohaoshuai";palindrome(a);char *b = "abcdcba";palindrome(b);return;
}

第三题

void AutoPop(void)
{SqStack S;int n, e;SElemType temp;InitStack(&S, 10);scanf("%d", &n);for(int i = 0;i < n; i++){scanf("%d", &e);if(S.top - S.base == S.stacksize)//栈满{printf("栈满,无法继续读入!");break;}else if(e == -1){Pop(&S, &temp);printf("%d\n", temp);}else{Push(&S, e);}}
}

第四题

使用了ctype.h库和math.h库,注意include

// 逆波兰表达式的运算方式:如果当前字符为变量或者为数字,则压栈,
// 如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
void AntiPolan(void)
{char ch;int num = 0, flag = 0, temp;SqStack S;InitStack(&S, 50);while((ch = getchar()) != '$'){if(isdigit(ch)){Push(&S, ch - '0');flag++;}else if(ch == ' ' && flag){for(int i = 0;i < flag; i++){Pop(&S, &temp);num += temp * pow(10, i);}Push(&S, num);flag = 0;num = 0;}else if(ch == '+'){int a, b;Pop(&S, &b);Pop(&S, &a);Push(&S, a+b);}else if(ch == '-'){int a, b;Pop(&S, &b);Pop(&S, &a);Push(&S, a-b);}else if(ch == '*'){int a, b;Pop(&S, &b);Pop(&S, &a);Push(&S, a*b);}else if(ch == '/'){int a, b;Pop(&S, &b);Pop(&S, &a);Push(&S, a/b);}      }Pop(&S, &num);printf("%d\n", num);
}

第五题

随时模拟压入和弹出次数即可

#include<stdio.h>int main(void)
{int num = 0;char ch;while((ch = getchar()) != '\n'){if(ch == 'I') num++;else if(ch == 'O') num--;if(num < 0) {printf("匹配失败!\n");return 0;}}printf("匹配成功!\n");return 0;
}

第六题

#include<stdio.h>
#include<stdlib.h>#define ElemType chartypedef struct QNode
{ElemType data;struct QNode *next;
}QNode, *QueuePtr;typedef struct
{QueuePtr rear;
}LinkQueue;void InitQue(LinkQueue *Q)
{QNode *H;H = (QNode *)malloc(sizeof(QNode));Q->rear = H;Q->rear->next = H;printf("链队初始化成功!\n");return;
}void EnQue(LinkQueue *Q, ElemType e)
{QNode *p;p = (QNode *)malloc(sizeof(QNode));p->data = e;p->next = Q->rear;Q->rear->next = p;printf("%c 元素入队成功\n",e);return;
}void DeQue(LinkQueue *Q, ElemType *e)
{if((Q->rear->next) == (Q->rear)){printf("队空\n");return;}QueuePtr p;//用来指示操作p = Q->rear;while(p->next->next != Q->rear) //p指针移到队头前一位{p = p->next;}QueuePtr q; q = p->next;//队头*e = q->data;free(q);p->next = Q->rear;printf("%c 元素出队成功!", *e);return;
}int IsEmpty(LinkQueue Q)
{return !(Q.rear->next == Q.rear);
}void ClearQue(LinkQueue *Q)
{if((Q->rear->next) == (Q->rear)){printf("队空\n");return;}QueuePtr p;//用来指示操作p = NULL;while(1){p = Q->rear->next;if(p == Q->rear)  break;Q->rear->next = p->next;free(p);}printf("队列已置空\n");return;
}int main(void)
{LinkQueue Q;ElemType e;InitQue(&Q);EnQue(&Q, 'm');DeQue(&Q, &e);return 0;
}

第七题和第八题与上面大同小异,改改就行

严蔚敏《数据结构(C语言版)》第三章 纯C实现相关推荐

  1. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

  2. 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严蔚敏<数据结构>(C语言版)配套题库[考研真题精选(部分视频讲解)+章节题库] 下载来源:http://fangcai.100xuexi.c ...

  3. 数据结构c语言版第三版实验四答案,数据结构(C语言版)第三四章习题答案

    Push( &s, t[i]); while( !EmptyStack( &s)) {// 每弹出一个字符与相应字符比较 temp=Pop (&s); if( temp!=S[ ...

  4. 数据结构使用c语言第5版答案,数据结构(c语言版)第五章答案.doc

    数据结构(c语言版)第五章答案.doc 第五章1.设二维数组A[8][10]是一个按行优先顺序存储在内存中的数组,已知A[0][0]的起始存储位置为1000,每个数组元素占用4个存储单元,求(1)A[ ...

  5. 数据结构c语言版第四章题库,严蔚敏《数据结构(c语言版)习题集》答案第四章 串...

    严蔚敏<数据结构(c语言版)习题集>答案第四章 串 第四章 串 4.10 void String_Reverse(Stringtype s,Stringtype &r)//求s的逆 ...

  6. 数据结构c语言版第四章题库,数据结构(C语言版)(第4版)习题

    数据结构(C语言版)(第4版)习题 习题 11.1 选择题.(1)计算机识别.存储和加工处理的对象统称为 .A.数据 B.数据元素 C.数据结构 D.数据类型(2)数据结构通常是研究数据的 及它们之间 ...

  7. 严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值

    这个我是看到华为今年招聘的机试题的第三题. 输入一串算术表达式的字符串,把它的结果算出来. 1 //表达式求值(输入.输出和中间结果均只能是0-9)运算符仅限+-*/. 2 #include < ...

  8. 线性表的顺序表示和实现 (创建,插入,删除,查找)数据结构 严蔚敏(C语言版)代码实现

    实现工具:dev 顺序表功能: 创建一个空的线性表: 在线性表中插入元素: 在线性表中删除元素: 在线性表中查找元素: 代码:(详解请看注释) #include<stdio.h> #inc ...

  9. c语言 怎么对百位数求余量,数据结构(C语言版)

    <数据结构(C语言版)>由会员分享,可在线阅读,更多相关<数据结构(C语言版)(52页珍藏版)>请在装配图网上搜索. 1.数据结构(C语言版)第7章图,第7章图,内容 7.1 ...

  10. 数据结构c语言程序题,严蔚敏《数据结构(c语言版)习题集》(包括基础部分).doc...

    严蔚敏<数据结构(c语言版)习题集>(包括基础部分).doc 线性表第1章绪论11简述下列术语数据,数据元素.数据对象.数据结构.存储结构.数据类型和抽象数据类型.解数据是对客观事物的符号 ...

最新文章

  1. nginx php动态编译加载模块.
  2. 【高德地图开发3】---地图显示
  3. win7专业版64位,台式机睡眠和休眠后立即被唤醒
  4. Vue报错bash: vue: command not found或者vue ui没有反应:官方修改成新的命令了
  5. 贪心算法(Greedy Algorithm)之霍夫曼编码
  6. 英伟达RTX 3080值不值得抢?在TensorFlow上训练了卷积网络
  7. ipad导入pdf_Ipad笔记法①日常笔记篇
  8. C#中声明、调用和配置事件的演示源码
  9. SpringSocial简介
  10. MFC 线程创建方式
  11. 在Eclipse里自动导入相应包的类名的快捷键
  12. .Hbase批量导入数据应用
  13. MAC 安装python3 菜鸟教程
  14. vs2017如何编写python_vs2017添加python的方法
  15. 学堂在线计算机,学堂在线PC客户端
  16. [学习笔记-SLAM篇]视觉SLAM十四讲ch3
  17. 醉枕江山第五十二章 公主中的公主
  18. 图像处理领域术语英文对应
  19. 基于STM32F407_温度传感器DS18B20的TFT显示屏实时显示温度
  20. 十万部冷知识:“澳大利亚”为什么属于亚洲球队?

热门文章

  1. Python Numpy random.rayleigh() 瑞利分布
  2. 图片如何裁剪出想要的大小?这几种裁剪方法分享给大家
  3. MySQL——单行函数的介绍和使用
  4. 二极管专题:二极管的反向恢复时间(动态特性)
  5. ffmpeg-日志输出av_log()
  6. 图像增强及运算篇之图像掩膜直方图和HS直方图
  7. scrapy爬取网易云音乐的MP3链接
  8. 安全网关性能更超群?新华三 SecPath M9000采用思博伦解决方案实测得验证!
  9. 洛谷P4799—— [CEOI2015 Day2]世界冰球锦标赛(折半搜索)
  10. 洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛