C语言 数据结构 堆

  1 // PRJ.cpp : Defines the entry point for the console application.
  2 //
  3
  4 #include "stdafx.h"
  5 #include "math.h"
  6 #include "stdlib.h"
  7
  8 typedef struct charType
  9 {
 10     char charArray[30];
 11     int top,buttom;
 12 } CT;
 13
 14 typedef struct DoubleType
 15 {
 16     double doubleArray[30];
 17     int top,buttom;
 18 } DT;
 19
 20 //如下代码 是使得字符串转为双精度浮点
 21 double chartof(char arr[],int n)
 22 {
 23     int i,k=-1,jishu=1,su=1;
 24     long t=0;
 25     for(i=0;i<n;i++)
 26     {
 27         if(arr[i]==‘.‘){k=i;}
 28         else{
 29             t*=jishu;
 30             t+=(int)arr[i]-0x30;
 31             jishu=10;
 32         }
 33     }
 34     if(k==-1)return (double)t;
 35     else return (double)t/pow(10,n-k-1);
 36
 37 }
 38 //转换为浮点结束
 39
 40 //数据结构-浮点栈 和它的三大操作  D_INIT  D_PUSH  D_POP
 41
 42
 43 void D_INIT(DT &dt)
 44 {
 45     dt.top=dt.buttom=0;
 46 }
 47
 48 void D_PUSH(DT &dt,double d)
 49 {
 50     dt.doubleArray[dt.top++]=d;
 51 }
 52
 53 double D_POP(DT &dt)
 54 {
 55
 56     return dt.doubleArray[--dt.top];
 57 }
 58 // 数据结构 完毕
 59
 60
 61 //数据结构-操作栈 和它的三大操作  C_INIT  C_PUSH  C_POP
 62
 63
 64 void C_INIT(CT & ct)
 65 {
 66     ct.top=ct.buttom=0;
 67 }
 68
 69 void C_PUSH(CT &ct,char c)
 70 {
 71     ct.charArray[ct.top++]=c;
 72 }
 73
 74 char  C_POP(CT &ct)
 75 {
 76     return ct.charArray[--ct.top];
 77 }
 78 // 数据结构 完毕
 79
 80
 81 int main(int argc, char* argv[])
 82 {
 83
 84     char shu[100];int i=0,j=0;
 85     double f,ff;    char c,cc,record;
 86     char temp[100];
 87
 88     ///初始化
 89     DT dt;CT ct;
 90     D_INIT(dt);C_INIT(ct);
 91
 92     ///初始化结束
 93     C_PUSH(ct,‘#‘);//栈底为#
 94     record=‘c‘;
 95     printf("请您输入一个四则运算表达式,以等号结束!\n");
 96
 97     while((c=getchar())!=‘\n‘)
 98     {
 99
100
101
102         temp[j++]=c;
103         //压栈问题
104         if(c>=‘0‘&&c<=‘9‘||c==‘.‘){
105             shu[i++]=c;
106
107         }
108         else
109         {
110             if(i!=0){ f=chartof(shu,i);D_PUSH(dt,f);record=‘d‘;i=0;}
111
112             while((cc=C_POP(ct))!=‘#‘)
113             {
114
115                 switch(c)
116                 {
117                 case ‘+‘:
118                     if(cc==‘(‘) {C_PUSH(ct,cc); goto label1;}
119                     if(cc==‘+‘) {ff=D_POP(dt);ff+=D_POP(dt);D_PUSH(dt,ff);}
120                     if(cc==‘-‘) {ff=D_POP(dt);ff=D_POP(dt)-ff;D_PUSH(dt,ff);}
121                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
122                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
123                     break;
124
125                 case ‘-‘:
126                     if(cc==‘(‘) {C_PUSH(ct,cc); goto label1;}
127                     if(cc==‘+‘) {ff=D_POP(dt);ff+=D_POP(dt);D_PUSH(dt,ff);}
128                     if(cc==‘-‘) {ff=D_POP(dt);ff=D_POP(dt)-ff;D_PUSH(dt,ff);}
129                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
130                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
131                     break;
132
133                 case ‘*‘:
134                     if(cc==‘(‘) {C_PUSH(ct,cc); goto label1;}
135                     if(cc==‘+‘) {C_PUSH(ct,‘+‘);goto label1;}
136                     if(cc==‘-‘) {C_PUSH(ct,‘-‘);goto label1;}
137                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
138                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
139                     break;
140
141                 case ‘/‘:
142                     if(cc==‘(‘) {C_PUSH(ct,cc); goto label1;}
143                     if(cc==‘+‘) {C_PUSH(ct,‘+‘);goto label1;}
144                     if(cc==‘-‘) {C_PUSH(ct,‘-‘);goto label1;}
145                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
146                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
147                     break;
148
149                 case ‘=‘:
150
151                     if(cc==‘+‘) {ff=D_POP(dt);ff+=D_POP(dt);D_PUSH(dt,ff);}
152                     if(cc==‘-‘) {ff=D_POP(dt);ff=D_POP(dt)-ff;D_PUSH(dt,ff);}
153                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
154                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
155                     break;
156
157                 case ‘(‘:
158                     C_PUSH(ct,cc);
159                     goto label1;
160                     break;
161                 case ‘)‘:
162                     if(cc==‘+‘) {ff=D_POP(dt);ff+=D_POP(dt);D_PUSH(dt,ff);}
163                     if(cc==‘-‘) {ff=D_POP(dt);ff=D_POP(dt)-ff;D_PUSH(dt,ff);}
164                     if(cc==‘*‘) {ff=D_POP(dt);ff*=D_POP(dt);D_PUSH(dt,ff);}
165                     if(cc==‘/‘) {ff=D_POP(dt);ff=D_POP(dt)/ff;D_PUSH(dt,ff);}
166                     if(cc==‘(‘) {goto label2;}
167                     break;
168
169                 default:
170                     printf("格式错误!\n");
171
172                     return 0;
173
174                     break;
175
176                 }
177                 /////运算处理结束
178
179
180
181
182             }
183
184             C_PUSH(ct,‘#‘);
185
186 label1:   if(ct.top!=ct.buttom){ cc=C_POP(ct);
187
188           if((record==‘c‘||record==‘a‘)&&cc==‘(‘&&c==‘-‘){C_PUSH(ct,cc);D_PUSH(dt,0.0f);}
189           else C_PUSH(ct,cc);
190           }
191           C_PUSH(ct,c);
192           record=‘c‘;
193
194
195         } //栈内处理
196
197
198
199
200 label2:        record=‘a‘;
201
202     }//所有文字输入while结束
203
204     temp[j]=‘\0‘;
205
206     printf("%s%.2f\n",temp,D_POP(dt));
207
208
209     return 0;
210 }
时间: 2024-10-12 13:40:04

C语言 数据结构 堆的相关文章

C语言中堆、栈、队列

C语言中堆.栈和队列: 1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优

读谭浩强C语言数据结构有感(1)

1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元素:数据有集合和元素的区别,集合里的个体就是数据元素,相对应的就是数据结构. 线性表: 说简单一点,就是线性存储结构,每个表中有大量的元素,这些元素在物理位置中都是连接起来的. 这些元素有直接前驱和直接后继.线性表的位置是相邻的. 比如,位置1,位置2,位置3......位置N. 还有一点,线性表的

基本数据结构——堆(Heap)的基本概念及其操作

基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在 O(1)~O(logn)之间. 可谓是相当的引领时尚潮流啊(我不信学信息学的你看到log和1的时间复杂度不会激动一下下)!. 什么是完全二叉树呢?别急着去百度啊,要百度我帮你百度: 若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1

数据结构--堆的实现之深入分析

一,介绍 以前在学习堆时,写了两篇文章:数据结构--堆的实现(上)   和   数据结构--堆的实现(下),  感觉对堆的认识还是不够.本文主要分析数据结构 堆(讨论小顶堆)的基本操作的一些细节,比如 insert(插入)操作 和 deleteMin(删除堆顶元素)操作的实现细节.分析建堆的时间复杂度.堆的优缺点及二叉堆的不足. 二,堆的实现分析 堆的物理存储结构是一维数组,逻辑存储结构是完全二叉树.堆的基本操作有:insert--向堆中插入一个元素:deleteMin--删除堆顶元素 故堆的类

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

数据结构--堆的实现(下)

1,堆作为优先级队列的应用 对于普通队列而言,具有的性质为FIFO,只要实现在队头删除元素,在队尾插入元素即可.因此,这种队列的优先级可视为按 时间到达 的顺序来衡量优先级的.到达得越早,优先级越高,就优先出队列被调度. 更一般地,很多应用不能单纯地按时间的先后来分优先级,比如按CPU占用时间或者其它方式……在这种情形下,使用堆更容易表达优先级队列. 2,堆的两个性质:①结构性质--堆从结构上看是一颗完全二叉树.然而,从物理存储上看,堆的实现基本上是使用一个一维数组存储堆中所有的结点.②orde

一些可运行的C语言数据结构代码

网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h> #define QUEUE_SIZE 50 typedef struct SeqQueue { int data[QUEUE_SIZE]; int front; int rear; }Queue; Queue *InitQueue() { Queue *q = (Queue *)malloc(sizeof(Que

C 数据结构堆

引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7%A9%8D 无数漂亮的图片接二连三, 但目前没搜到一个工程中可以舒服用的代码库. 本文由此痛点而来. 写一篇奇妙数据结构堆的终结代码. 耳熟终究比不过手热 ->--- 对于 heap 接口思考, 我是这样设计 #ifndef _H_HEAP #define _H_HEAP // // cmp_f

C语言中堆和栈的区别

原文:http://blog.csdn.net/tigerjibo/article/details/7423728 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示: 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值.其操作方式类似于数据结构中的栈. 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄