顺序结构循环队列

#include<iostream>using namespace std; typedef int datatype; const int maxsize = 100; typedef struct node { datatype data[maxsize]; int front, rear; }sqqueue; void init_sqqueue(sqqueue* lq) { lq->front = lq->rear = 0; cout << "创建队列成功" << endl; } int en_sqqueue(sqqueue* lq, datatype x) { if ((lq->rear + 1) % maxsize == lq->front) { cout << "队满,无法入队" << endl; return 0; } lq->rear = (lq->rear + 1) % maxsize; lq->data[lq->rear] = x; cout << "入队元素为" << x << endl; return 1; } int de_sqqueue(sqqueue* lq, datatype* x) { if (lq->front == lq->rear) { cout << "队列为空" << endl; return 0; } lq->front = (lq->front + 1) % maxsize; *x = lq->data[lq->front]; cout << "出队元素为" << *x << endl; return 1; } int empty_sqqueue(sqqueue* lq) { if (lq->front == lq->rear) { cout << "队空" << endl; return 1; } else { cout << "队不空" << endl; return 0; } } int main() { sqqueue* lq; datatype* x; x = new datatype; lq = new sqqueue; init_sqqueue(lq); empty_sqqueue(lq); en_sqqueue(lq, 100); en_sqqueue(lq, 200); empty_sqqueue(lq); de_sqqueue(lq, x); de_sqqueue(lq, x); empty_sqqueue(lq); return 0; } ……

阅读全文

链式队列

最近数据结构老师要求我们在上机课上要不看书敲出来链式队列并实现功能,所以在此练练手 由于比较简单,所以直接上代码 #include<iostream> using namespace std; typedef int datatype; typedef struct node* pointer; struct node{ datatype data; pointer next; }; typedef struct{ pointer front,rear; }lkqueue; void init_lkqueue(lkqueue *lq){//创建链队列 pointer p; p=new node; p->next=NULL; lq->front=p; lq->rear=p; } void enter_lkqueue(lkqueue *lq,datatype x){//入队功能实现 pointer s; s=new node; s->data=x; lq->rear->next=s; lq->rear=s; s->next=NULL; } int empty_lkqueue(lkqueue *lq){//判断队列是否为空 if(lq->front==lq->rear)return 1; else return 0; } int out_lkqueue(lkqueue *lq,datatype *x){//出队功能实现 pointer s; if(lq->front==lq->rear){ cout<<"队空,不能出队!"<<endl; return 0; } s=lq->front->next; *x=s->data; lq->front->next=s->next; cout<<"出队元素为"<<*x<<endl; delete s; return 1; } int main(){ lkqueue *lq; lq=new lkqueue; datatype *x; x=new datatype; init_lkqueue(lq); empty_lkqueue(lq); enter_lkqueue(lq,100); empty_lkqueue(lq); out_lkqueue(lq,x); empty_lkqueue(lq); return 0; } ……

阅读全文

二叉树的链接结构

对着书本敲了一个钟的二叉树,被二叉树建立时的输入问题困扰了很久。二叉树的建立一般使用递归算法,将所有节点的数据猛的输入,递归无法停止,二叉树就无法建立。 自己对着书本敲了一次也没发现怎么回事,最后看了一篇博文之后,豁然开朗。我们在输入节点数据的时候,必须输入空闲叶子结点,并用特殊符号标记。 最后自己终于实现了最终的二叉链表的构造及其三种顺序遍历的实现 PS:输入的时候得适当制造一定数量的空节点才能结束二叉树的输入,这个需要个人自己体会。 代码如下: #include <iostream> using namespace std; typedef struct node* pointer; typedef char datatype; typedef struct node { datatype data; pointer left, right; }BinTNode;//定义结构体BinTNode typedef BinTNode* BinTree;//结构体指针BinTree BinTree Create_Tree()//二叉树的创建 { BinTree p; char c; cin >> c; if (c == '#')//如果遇到字符串"#",则设该结点值为空 p = NULL; else { p = new node; p->data = c; p->left = Create_Tree(); p->right = Create_Tree(); } return p;//返回二叉树结构体指针 } void preorder(BinTree T) {//先序遍历 if (T !……

阅读全文

栈实现十进制转换二进制

思路分析: 只需要用一个变量来存储余数,并入栈即可。另外需要注意一下maxsize-1才是栈满;p.data[p.top]代表的是datatype x的值。 下面是代码实现: #include <iostream> using namespace std; const int maxsize = 16; typedef int datatype; typedef struct { datatype data[maxsize]; int top; }sqstack; void init_sqstack(sqstack* sq) { sq->top = -1; } int empty_sqstack(sqstack* sq) { if (sq->top == -1)return 1; else return 0; } int push_sqstack(sqstack* sq, datatype x) { if (sq->top == maxsize - 1) { cout << "栈满,不能进栈!\n"; return 0; } sq->data[++sq->top] = x; return 1; } int pop_sqstack(sqstack* sq, datatype* x) { if (sq->top == -1) { cout << "栈空,不能退栈!……

阅读全文

栈实现括号匹配

如何用栈实现简单的括号匹配 思路很简单,利用栈的压栈出栈的特点,输入的字符为“(”就入栈,“)”就出栈,如果栈是空,就是匹配成功,因为“()”成对出现。 接下来为代码实现,分别是C++本身的STL库中的stack和自己手写的stack功能实现: C++STL: #include<iostream> #include<stack> using namespace std; stack<int>st; int main(){ char x; int flag,a,b; while(cin>>x){ if(x=='('){ st.push(x); } if(x==')'){ st.pop(); } if(st.empty()){ flag=1; } else { flag=0; } } if(flag){ cout<<"1"<<endl; }else { cout<<"0"<<endl; } return 0; } 自己手写的栈功能: #include<iostream> using namespace std; const int maxsize=100; typedef char datatype; typedef char ElemType; typedef struct{ datatype data[maxsize]; int top; }sqstack; void init_sqstack(sqstack *sq){ sq->top=-1; } int empty(sqstack *sq){ if(sq->top==-1){ return 1; } else return 0; } int push_sqstack(sqstack *sq,datatype x){ if(sq->top==maxsize-1){ cout<<"栈满,不能进栈!……

阅读全文

皮克定理及其应用

H - 三角形 4.1 Description A lattice point is an ordered pair (x,y) where x and y are both integers. Given the coordinates of the vertices of a triangle(which happen to be lattice points), you are to count the number of lattice points which lie completely inside of the triangle(points on the edges or vertices of the triangle do not count). 4.2 Input The input test file will contain multiple test cases.……

阅读全文

链表之多项式加法

数据结构上机课的一次作业: 实现多项式的加法。开始并没有立刻做出来,主要原因是用insert插入的时候的i值没有把握好,以及当值两个链表中的指数相等的时候的处理没有到位。后来经过一番修改后,功能都得以实现。 当天晚上学习了一下怎么放图片博客,终于万事俱备,开始写博客啦 #include <iostream> using namespace std; typedef int datatype; typedef int index; typedef struct node* pointer; struct node { datatype data; index ind; pointer next; }; typedef pointer lklist; lklist init() { pointer head; head = new node; head->next = NULL; return head; } lklist create(lklist head) { pointer rear, s; int a,b; rear = head; while (cin >> a >> b && (a != -1 && b !……

阅读全文

GCD与LCM

本篇将讲述一下辗转相除法 GCD(欧几里得)算法求的是两数的最大公约数 LCM算法则是在GCD的基础上算出两数的最小公倍数 辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的: ⒈ 若 r 是 a ÷ b 的余数,且r不为0, 则 gcd(a,b) = gcd(b,r) ⒉ a 和其倍数之最大公因子为 a。 另一种写法是: ⒈ 令r为a/b所得余数(0≤r<b) 若 r= 0,算法结束;b 即为答案。 ⒉ 互换:置 a←b,b←r,并返回第一步。 代码如下: GCD给出了上述第二种互换的代码实现: inline int gcd(int a,int b) { return !b? a:gcd(b,a%b); } inline int lcm(int a,int b) { return a/gcd(a,b)*b; } ……

阅读全文