1. 程式人生 > >資料結構實驗複習

資料結構實驗複習

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;
}