大二資料結構學習3(棧和佇列)

晨沉宸辰發表於2020-10-04

一 定義

1.棧:限定僅在表尾進行插入或刪除操作的線性表
2 棧底固定不變,後進先出

二 程式碼結構

【1】靜態分佈

typedef struct link//定義一個棧
{
    ElemType elem[maxleng];//棧中的資料
    int top;//棧的頭結點

}sqstack;

【2】動態分佈

#define maxleng 100//限定棧的最長長度
typedef int ElemType;//用ElemType代替int型別
typedef struct link//定義一個棧
{
    ElemType elem[maxleng];//棧中的資料
    int top;//棧的頭結點

}sqstack;

【3】初始化

void initstack(sqstack &s)//初始化棧,讓top指向頭
{
    s.top=0;
}


【4】入棧

int seg_push(sqstack &s,ElemType e)//入棧
{
    if(s.top>maxleng)
    {
        cout<<"滿了"<< endl;
        return 1;
    }
s.elem[s.top]=e;
s.top++;
return 1;

}

【5】出棧

void seg_pop(sqstack &s)//出棧
{
    while(s.top!=0)
    {
        printf("%d",s.elem[s.top-1]);
s.top--;
    }
}

【6】建立完整棧,實現入棧出棧

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define maxleng 100//限定棧的最長長度
typedef int ElemType;//用ElemType代替int型別
typedef struct link//定義一個棧
{
    ElemType elem[maxleng];//棧中的資料
    int top;//棧的頭結點

}sqstack;
void initstack(sqstack &s)//初始化棧,讓top指向頭
{
    s.top=0;
}
int seg_push(sqstack &s,ElemType e)//入棧
{
    if(s.top>maxleng)
    {
        cout<<"滿了"<< endl;
        return 1;
    }
s.elem[s.top]=e;
s.top++;
return 1;

}
void seg_pop(sqstack &s)//出棧
{
    while(s.top!=0)
    {
        printf("%d",s.elem[s.top-1]);
s.top--;
    }
}
int main()//主函式
{   int n,m,j,e;
scanf("%d",&n);
sqstack s;
initstack(s);

for(int i=0;i<n;i++)
{
    scanf("%d",&e);
    seg_push(s,e);
}
/*if(s.top==0)
    printf("error!!");
else
    for(int i=0;i<n;i++)
{
    printf("%d",s.elem[s.top-1]);
    s.top--;
}*/
Seg_pop(s);
    return 0;
}


鏈棧

一 定義

1.棧的鏈式儲存結構為鏈棧
2.他的運算是受限的單連結串列,其插入和刪除操作僅限制在表頭位置上進行,由於智慧在連結串列 頭部進行操作,故連結串列沒有必要像單連結串列那樣附加頭結點。棧的頂指標就是連結串列的頭指標

二 結構程式碼

【1】建立結構

#define maxleng 100
typedef int ElemType;
typedef struct link
{
    ElemType elem;
    struct link *next;

}* linkstack;

【2】初始化

void initstack (linkstack &s)
{
    s=NULL;

}

【3】入棧

void push_link(linkstack &s,ElemType e)
{
    linkstack p;
    p=new link;
    p->elem=e;
    p->next=s;
    s=p;

}

【4】出棧

void pop_link(linkstack &s)
{
    linkstack p;
    while(s!=NULL)
    {

    p=s;printf("%d",p->elem);s=s->next;
}
    }

【5】總體建立,實現出棧入棧

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define maxleng 100
typedef int ElemType;
typedef struct link
{
    ElemType elem;
    struct link *next;

}* linkstack;
void initstack (linkstack &s)
{
    s=NULL;

}
void push_link(linkstack &s,ElemType e)
{
    linkstack p;
    p=new link;
    p->elem=e;
    p->next=s;
    s=p;

}
void pop_link(linkstack &s)
{
    linkstack p;
    while(s!=NULL)
    {

    p=s;printf("%d",p->elem);s=s->next;
}
    }

int main()
{  linkstack s;
   initstack(s);
   ElemType n,m,i;
   scanf("%d" ,&n);
   for(i=0;i<n;i++)
   {  scanf("%d",&m);
      push_link(s,m);

   }
   pop_link(s);

    return 0;
}

棧的應用

一.數制轉換

【1】思想:

利用 m = ( N / d ) × d + n % d m=\left( N/d\right) \times d+n\% d m=(N/d)×d+n%d

【2】程式碼:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define maxleng 100
typedef int ElemType;
#define k 2//表示二進位制
typedef struct link
{
    ElemType elem;
    struct link *next;

}* linkstack;
void initstack (linkstack &s)
{
    s=NULL;

}
void push_link(linkstack &s,ElemType e)
{
    linkstack p;
    p=new link;
    p->elem=e;
    p->next=s;
    s=p;

}
void pop_link(linkstack &s)
{
    linkstack p;
    while(s!=NULL)
    {

    p=s;printf("%d",p->elem);s=s->next;
}
    }

int main()
{  linkstack s;
   initstack(s);
   ElemType n,m,i;
   scanf("%d",&n);
   while(n>0)
   {  push_link(s,n%k);
   n=n/k;

   }
pop_link(s);

    return 0;
}

相關文章