資料結構實驗複習
1 順序建立連結串列
題目描述
輸入N個整數,按照輸入的順序建立單鏈表儲存,並遍歷所建立的單鏈表,輸出這些資料。輸入
第一行輸入整數的個數N;第二行依次輸入每個整數。
輸出
輸出這組整數。示例輸入
8 12 56 4 6 55 15 33 62
示例輸出
12 56 4 6 55 15 33 62
#include<stdio.h> #include<iostream> using namespace std; struct node { int d; node *next; }; node *CreatList(int n) //順序建表,尾插法 { node *head=new node; head->next=NULL; node *tail=head;//tail是指向head的指標 for(int i=0;i<n;i++) { node *p=new node ; cin>>p->d; tail->next=p; tail=p; } tail->next=NULL; return head; } void PrintList(node *head) //輸出連結串列 { node *p=head->next; while(p!=NULL) { if(p->next==NULL) cout<<p->d<<endl; else cout<<p->d<<" "; p=p->next; } } int main() { int n; cin>>n; node *head=NULL; head=CreatList(n); PrintList(head); return 0; }
2.棧的使用
有效的括號
#include <iostream> #include <stack> #include <string.h> using namespace std; int main() { stack<char>seq; char a[50]; while(cin>>a) { int i; if(a[0]==' ')break; for(i=0;i<strlen(a);i++) { if(a[i]=='(') seq.push(a[i]); else if(a[i]==')') { if(seq.top()!='(') { cout<<"false"<<endl; break; } seq.pop(); } if(a[i]=='[') seq.push(a[i]); else if(a[i]==']') { if(seq.top()!='[') { cout<<"false"<<endl; break; } seq.pop(); } if(a[i]=='{') seq.push(a[i]); else if(a[i]=='}') { if(seq.top()!='{') { cout<<"false"<<endl; break; } seq.pop(); } } if(i>=strlen(a)) cout<<"true"<<endl; } return 0; }
3.佇列的使用(queue)
基本操作:
push(x) 將x壓入佇列的末端
pop() 彈出佇列的第一個元素(隊頂元素),注意此函式並不返回任何值
front() 返回第一個元素(隊頂元素)
back() 返回最後被壓入的元素(隊尾元素)
empty() 當佇列為空時,返回true
size() 返回佇列的長度
使用方法:
標頭檔案:#include <queue>
宣告方法:
1、普通宣告
queue<標明q的型別int char 之類>q;2、結構體
struct node{ int x, y;};queue<node>q;4.樹的遍歷
二叉樹表的結點結構定義
typedef struct BiTNode{ char ch; //結點資料 struct BiTNode *lchild; //左孩子 struct BiTNode *rchild; //右孩子 }BiTNode,*BiTree;
二叉樹的創造:
void AddBiTree(BiTree T,BiTree p)
{
if((p->ch <= T->ch)&&(T->lchild!=NULL))
AddBiTree(T->lchild,p);
else if((p->ch <= T->ch)&&(T->lchild==NULL))
T->lchild=p;
else if(T->rchild!=NULL)
AddBiTree(T->rchild,p);
else T->rchild=p;
}
前序遍歷:
void PreOrderTraverse(BiTree T)
{
if(T){
cout<<T->ch;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
中序遍歷:
void InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
cout<<T->ch;
InOrderTraverse(T->rchild);
}
}
後序遍歷:
void PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->ch;
}
}
層次遍歷:
void bfs(Bitree T)
{
queue<Bitree> q;
q.push(T);
while(!q.empty() )
{
Bitree now=q.front() ;
q.pop() ;
cout<<now->ch;
num++;
if(num<n) cout<<' ';
if(now->lchild!=NULL) q.push(now->lchild);
if(now->rchild!=NULL) q.push(now->rchild);
}
}
5.排序: https://blog.csdn.net/wzyhb123456789/article/details/5974790
全排列:https://blog.csdn.net/qq_41486817/article/details/80617270
利用佇列實現二叉樹的層次遍歷:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//建樹
{
char ch;
scanf("%c",&ch);
if(ch==' ')
{
T=NULL;
return;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void LevelOrderTraverse(BiTree T)//層次遍歷
{
queue<BiTree> Queue;
if(!T)
{
printf("空樹!\n");
return;
}
Queue.push(T);
while(!Queue.empty())
{
T=Queue.front();
Queue.pop();
printf("%c",T->data);
if(T->lchild)
Queue.push(T->lchild);
if(T->rchild)
Queue.push(T->rchild);
}
}
void main()
{
BiTree T;
CreateBiTree(T);
LevelOrderTraverse(T);
printf("\n");
}
1.要使用sort函式只需用#include <algorithm> 即可使用,語法描述為:
sort(begin,end),表示一個範圍,例如:
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}
輸出結果將是把陣列a按升序排序。
2.sort中增加一個引數,可升序可降序。
1)自己編寫compare函式:
bool compare(int a,int b)
{
return a<b; //升序排列,如果改為return a>b,則為降序
}
2)接著呼叫三個引數的sort:sort(begin,end,compare)就成了。對於list容器,這個方法也適用,把compare作為sort的引數就可以了,即:sort(compare).
int _tmain(int argc, _TCHAR* argv[])
{
int a[20]={2,4,1,23,5,76,0,43,24,65},i;
for(i=0;i<20;i++)
cout<<a[i]<<endl;
sort(a,a+20,compare);
for(i=0;i<20;i++)
cout<<a[i]<<endl;
return 0;
}