zoukankan      html  css  js  c++  java
  • 数据结构之顺序栈SqStack

    顺序栈SqStack

    基本操作

    1 Status InitStack()//构造一个空栈S
    2 Status DestroyStack()//销毁栈S,S不再存在
    3 Status ClearStack()//把S置为空栈
    4 Status StackEmpty()//若S为空栈,则返回true,否则返回false
    5 int StackLength()//返回S的元素个数,即栈的长度
    6 Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
    7 Status Push(SElemType e)//插入元素e为新的栈顶元素
    8 Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
    9 Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败

    几个小程序(代码正误检验,数制转换,括号匹配检验,行编辑程序)

    1 CheckStackCode();//测试Stack代码正确性
    2 Conversion();//数制转换
    3 BracketsMatching();//括号匹配的检验
    4 LineEdit();//行编辑程序
      1 //
      2 //by coolxxx
      3 //#include<bits/stdc++.h>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<map>
      9 #include<stack>
     10 #include<queue>
     11 #include<set>
     12 #include<bitset>
     13 #include<memory.h>
     14 #include<time.h>
     15 #include<stdio.h>
     16 #include<stdlib.h>
     17 #include<string.h>
     18 //#include<stdbool.h>
     19 #include<math.h>
     20 #define min(a,b) ((a)<(b)?(a):(b))
     21 #define max(a,b) ((a)>(b)?(a):(b))
     22 #define abs(a) ((a)>0?(a):(-(a)))
     23 #define lowbit(a) (a&(-a))
     24 #define sqr(a) ((a)*(a))
     25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     26 #define mem(a,b) memset(a,b,sizeof(a))
     27 #define eps (1e-10)
     28 #define J 10000
     29 #define mod 1000000007
     30 #define MAX 0x7f7f7f7f
     31 #define PI 3.14159265358979323
     32 #pragma comment(linker,"/STACK:1024000000,1024000000")
     33 #define N 104
     34 
     35 using namespace std;
     36 typedef long long LL;
     37 /*
     38 double anss;
     39 LL aans,sum;
     40 int cas,cass;
     41 int n,m,lll,ans;
     42 */
     43 
     44 
     45 const int OK=1;
     46 const int ERROR=0;
     47 const int INFEASIBLE=-1;
     48 const int STACK_INIT_SIZE=100;//存储空间初始分配量
     49 const int STACKINCREMENT=10;//存储空间分配增量
     50 typedef int Status;
     51 typedef int SElemType;
     52 
     53 Status OutputInt(SElemType e);
     54 Status OutputChar(SElemType e);
     55 typedef struct
     56 {
     57     SElemType *base;//栈构造之前和销毁之后,base的值为NULL
     58     SElemType *top;//栈顶指针
     59     int stacksize;//当前已分配的存储空间,以元素为单位
     60     
     61     Status InitStack()//构造一个空栈S
     62     {
     63         base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     64         if(!base)exit(OVERFLOW);//存储分配失败
     65         top=base;
     66         stacksize=STACK_INIT_SIZE;
     67         return OK;
     68     }//InitStack
     69     
     70     Status DestroyStack()//销毁栈S,S不再存在
     71     {
     72         free(base);
     73         base=NULL;
     74         top=NULL;
     75         stacksize=0;
     76         return OK;
     77     }//DestroyStack
     78     
     79     Status ClearStack()//把S置为空栈
     80     {
     81         top=base;
     82         return OK;
     83     }//ClearStack
     84     
     85     Status StackEmpty()//若S为空栈,则返回true,否则返回false
     86     {
     87         if(top==base)return true;
     88         return false;
     89     }//StackEmpty
     90     
     91     int StackLength()//返回S的元素个数,即栈的长度
     92     {
     93         return top-base;
     94     }//StackLength
     95     
     96     Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
     97     {
     98         if(top==base)return ERROR;
     99         e=*(top-1);
    100         return OK;
    101     }//GetTop
    102     
    103     Status Push(SElemType e)//插入元素e为新的栈顶元素
    104     {
    105         if(top-base>=stacksize)//栈满,追加存储空间
    106         {
    107             base=(SElemType *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(SElemType));
    108             if(!base)exit(OVERFLOW);//存储分配失败
    109             top=base+stacksize;
    110             stacksize+=STACKINCREMENT;
    111         }
    112         (*top++)=e;
    113         return OK;
    114     }//Push
    115     
    116     Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
    117     {
    118         if(top==base)return ERROR;
    119         e=(*--top);
    120         return OK;
    121     }//Pop
    122     
    123     Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败
    124     {
    125         SElemType *i=base;
    126         Status (*visit)(SElemType);
    127         if(p==1)visit=OutputInt;
    128         else if(p==0)visit=OutputChar;
    129         while(top>i)
    130             visit(*i++);
    131         puts("");
    132         return OK;
    133     }//StackTraverse
    134 }SqStack;
    135 
    136 Status OutputInt(SElemType e)
    137 {
    138     printf("%d ",e);
    139     return OK;
    140 }
    141 Status OutputChar(SElemType e)
    142 {
    143     printf("%c",e);
    144     return OK;
    145 }
    146 
    147 
    148 void CheckStackCode()
    149 {
    150     typedef int SElemType;
    151     int i;
    152     SqStack S;
    153     SElemType e;
    154     if(S.InitStack()==OK)
    155     {
    156         for(i=1;i<=12;i++)
    157             S.Push(i);
    158     }
    159     printf("栈中元素依次为:");
    160     S.StackTraverse(1);
    161     S.Pop(e);
    162     printf("弹出的栈顶元素 e=%d
    ",e);
    163     printf("栈空否:%d(1:空 0:否)
    ",S.StackEmpty());
    164     S.GetTop(e);
    165     printf("栈顶元素 e=%d 栈的长度为%d
    ",e,S.StackLength());
    166     S.Push(13);
    167     printf("栈中元素依次为:");
    168     S.StackTraverse(1);
    169     S.GetTop(e);
    170     printf("栈顶元素 e=%d 栈的长度为%d
    ",e,S.StackLength());
    171     S.DestroyStack();
    172     printf("销毁栈后,S.top=%d  S.base=%d  S.stacksize=%d
    ",S.top,S.base,S.stacksize);
    173 }
    174 
    175 void Conversion()//对于输入的任意一个非负十进制整数n,打印输出与其等值的八进制数
    176 {
    177     typedef int SElemType;
    178     int n;
    179     SqStack S;
    180     SElemType e;
    181     
    182     S.InitStack();//构造空栈
    183     scanf("%d",&n);
    184     while(n)
    185     {
    186         S.Push(n%8);
    187         n/=8;
    188     }
    189     while(!S.StackEmpty())
    190     {
    191         S.Pop(e);
    192         printf("%d",e);
    193     }
    194     puts("");
    195     
    196     S.DestroyStack();
    197 }
    198 
    199 void BracketsMatching()//三种括号()[]{},检验是否合法
    200 {
    201     
    202     char s[N];
    203     SqStack S;
    204     SElemType e;
    205     int i;
    206     S.InitStack();
    207     scanf("%s",s);
    208     
    209     for(i=0;i<strlen(s);i++)
    210     {
    211         if(s[i]=='(' || s[i]=='{' || s[i]=='[')
    212             S.Push(s[i]);
    213         else if(s[i]==')' || s[i]=='}' || s[i]==']')
    214         {
    215             if(S.GetTop(e) && ((e=='(' && s[i]==')') || (e=='[' && s[i]==']') || (e=='{' && s[i]=='}')))
    216                 S.Pop(e);
    217             else
    218             {
    219                 puts("NO");
    220                 S.DestroyStack();
    221                 return;
    222             }
    223         }
    224     }
    225     if(S.StackEmpty())puts("YES");
    226     else puts("NO");
    227     S.DestroyStack();
    228 }
    229 
    230 void LineEdit()//从终端接收一行并传送至调用过程的数据区,#为退格符,@为退行符
    231 {
    232     int i;
    233     char ch;
    234     SqStack S;
    235     SElemType e;
    236     S.InitStack();
    237     while(ch!=EOF)
    238     {
    239         for(ch=getchar();ch!=EOF && ch!='
    ';ch=getchar())
    240         {
    241             if(ch=='#')S.Pop(e);
    242             else if(ch=='@')S.ClearStack();
    243             else S.Push(ch);
    244         }
    245         S.StackTraverse(0);
    246         S.ClearStack();
    247     }
    248     S.DestroyStack();
    249 }
    250 
    251 
    252 int main()
    253 {
    254     #ifndef ONLINE_JUDGEW
    255     freopen("1.txt","r",stdin);
    256 //    freopen("2.txt","w",stdout);
    257     #endif
    258     int i,j,k;
    259 //    init();
    260 //    for(scanf("%d",&cass);cass;cass--)
    261 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    262 //    while(~scanf("%s",s))
    263 /*
    264     while(~scanf("%d%d",&n,&m))
    265     {
    266         
    267     }
    268     */
    269     
    270     CheckStackCode();//测试Stack代码正确性
    271     
    272     Conversion();//数制转换
    273     
    274     BracketsMatching();//括号匹配的检验
    275     
    276     LineEdit();//行编辑程序
    277     
    278     return 0;
    279 }
    280 /*
    281 //
    282 
    283 //
    284 */

    马踏棋盘问题(NxN)

    暴力(顺序栈实现)

      1 //
      2 //by coolxxx
      3 //#include<bits/stdc++.h>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<map>
      9 #include<stack>
     10 #include<queue>
     11 #include<set>
     12 #include<bitset>
     13 #include<memory.h>
     14 #include<time.h>
     15 #include<stdio.h>
     16 #include<stdlib.h>
     17 #include<string.h>
     18 //#include<stdbool.h>
     19 #include<math.h>
     20 #define min(a,b) ((a)<(b)?(a):(b))
     21 #define max(a,b) ((a)>(b)?(a):(b))
     22 #define abs(a) ((a)>0?(a):(-(a)))
     23 #define lowbit(a) (a&(-a))
     24 #define sqr(a) ((a)*(a))
     25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     26 #define mem(a,b) memset(a,b,sizeof(a))
     27 #define eps (1e-10)
     28 #define J 10000
     29 #define mod 1000000007
     30 #define MAX 0x7f7f7f7f
     31 #define PI 3.14159265358979323
     32 #pragma comment(linker,"/STACK:1024000000,1024000000")
     33 #define N 8
     34 using namespace std;
     35 typedef long long LL;
     36 double anss;
     37 LL aans;
     38 int cas,cass;
     39 LL n,m,lll,ans;
     40 int a[N][N];
     41 bool u[N][N];
     42 int dx[]={-2,-1,1,2,2,1,-1,-2};
     43 int dy[]={1,2,2,1,-1,-2,-2,-1};
     44 
     45 const int OK=1;
     46 const int ERROR=0;
     47 const int INFEASIBLE=-1;
     48 const int STACK_INIT_SIZE=10000;//存储空间初始分配量
     49 const int STACKINCREMENT=10000;//存储空间分配增量
     50 typedef int Status;
     51 
     52 typedef struct
     53 {
     54     int x,y,dir;
     55 }SElemType;
     56 
     57 Status OutputInt(SElemType e);
     58 Status OutputChar(SElemType e);
     59 typedef struct
     60 {
     61     SElemType *base;//栈构造之前和销毁之后,base的值为NULL
     62     SElemType *top;//栈顶指针
     63     int stacksize;//当前已分配的存储空间,以元素为单位
     64     
     65     Status InitStack()//构造一个空栈S
     66     {
     67         base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     68         if(!base)exit(OVERFLOW);//存储分配失败
     69         top=base;
     70         stacksize=STACK_INIT_SIZE;
     71         return OK;
     72     }//InitStack
     73     
     74     Status DestroyStack()//销毁栈S,S不再存在
     75     {
     76         free(base);
     77         base=NULL;
     78         top=NULL;
     79         stacksize=0;
     80         return OK;
     81     }//DestroyStack
     82     
     83     Status ClearStack()//把S置为空栈
     84     {
     85         top=base;
     86         return OK;
     87     }//ClearStack
     88     
     89     Status StackEmpty()//若S为空栈,则返回true,否则返回false
     90     {
     91         if(top==base)return true;
     92         return false;
     93     }//StackEmpty
     94     
     95     int StackLength()//返回S的元素个数,即栈的长度
     96     {
     97         return top-base;
     98     }//StackLength
     99     
    100     Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
    101     {
    102         if(top==base)return ERROR;
    103         e=*(top-1);
    104         return OK;
    105     }//GetTop
    106     
    107     Status Push(SElemType e)//插入元素e为新的栈顶元素
    108     {
    109         if(top-base>=stacksize)//栈满,追加存储空间
    110         {
    111             base=(SElemType *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(SElemType));
    112             if(!base)exit(OVERFLOW);//存储分配失败
    113             top=base+stacksize;
    114             stacksize+=STACKINCREMENT;
    115         }
    116         (*top++)=e;
    117         return OK;
    118     }//Push
    119     
    120     Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
    121     {
    122         if(top==base)return ERROR;
    123         e=(*--top);
    124         return OK;
    125     }//Pop
    126     
    127     Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败
    128     {
    129         SElemType *i=base;
    130         Status (*visit)(SElemType);
    131         if(p==1)visit=OutputInt;
    132         else if(p==0)visit=OutputChar;
    133         while(top>i)
    134             visit(*i++);
    135         puts("");
    136         return OK;
    137     }//StackTraverse
    138 }SqStack;
    139 Status OutputInt(SElemType e)
    140 {
    141     printf("%d ",e);
    142     return OK;
    143 }
    144 Status OutputChar(SElemType e)
    145 {
    146     printf("%c",e);
    147     return OK;
    148 }
    149 
    150 SqStack S;
    151 void print()
    152 {
    153     int i,j;
    154     for(i=0;i<N;i++,puts(""))
    155         for(j=0;j<N;j++)
    156             printf("%d ",a[i][j]);
    157     puts("");
    158 }
    159 int main()
    160 {
    161     #ifndef ONLINE_JUDGEW
    162     freopen("1.txt","r",stdin);
    163 //    freopen("2.txt","w",stdout);
    164     #endif
    165     int i,j,k;
    166     int x,y,z,xx,yy;
    167 //    init();
    168 //    for(scanf("%d",&cass);cass;cass--)
    169 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    170 //    while(~scanf("%s",s))
    171     while(~scanf("%d%d",&n,&m))
    172     {
    173         mem(a,0);mem(u,0);
    174         S.InitStack();
    175         SElemType e,to;
    176         e.x=n,e.y=m,e.dir=-1;
    177         u[n][m]=1;
    178         S.Push(e);
    179         loop : while(S.top-S.base<N*N && !S.StackEmpty())
    180         {
    181             SElemType & now=*(S.top-1);
    182             for(++now.dir;now.dir<8;now.dir++)
    183             {
    184                 xx=now.x+dx[now.dir],yy=now.y+dy[now.dir];
    185                 if(xx>=0 && xx<N && yy>=0 && yy<N && !u[xx][yy])
    186                 {
    187                     u[xx][yy]=1;
    188                     to.x=xx,to.y=yy,to.dir=-1;
    189                     S.Push(to);
    190                     goto loop;
    191                 }
    192             }
    193             S.Pop(e);
    194             u[e.x][e.y]=0;
    195         }
    196         if(S.StackEmpty()){puts("No Answer
    ");continue;}
    197         SElemType *id;
    198         for(id=S.base,cas=0;id!=S.top;id++)
    199         {
    200             e=(*id);
    201             a[e.x][e.y]=++cas;
    202         }
    203         print();
    204         S.DestroyStack();
    205     }
    206     return 0;
    207 }

    马踏棋盘贪心优化

      1 // 
      2 //by coolxxx
      3 //#include<bits/stdc++.h>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<string>
      7 #include<iomanip>
      8 #include<map>
      9 #include<stack>
     10 #include<queue>
     11 #include<set>
     12 #include<bitset>
     13 #include<memory.h>
     14 #include<time.h>
     15 #include<stdio.h>
     16 #include<stdlib.h>
     17 #include<string.h>
     18 //#include<stdbool.h>
     19 #include<math.h>
     20 #define min(a,b) ((a)<(b)?(a):(b))
     21 #define max(a,b) ((a)>(b)?(a):(b))
     22 #define abs(a) ((a)>0?(a):(-(a)))
     23 #define lowbit(a) (a&(-a))
     24 #define sqr(a) ((a)*(a))
     25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
     26 #define mem(a,b) memset(a,b,sizeof(a))
     27 #define eps (1e-10)
     28 #define J 10000
     29 #define mod 1000000007
     30 #define MAX 0x7f7f7f7f
     31 #define PI 3.14159265358979323
     32 #pragma comment(linker,"/STACK:1024000000,1024000000")
     33 #define N 8
     34 using namespace std;
     35 typedef long long LL;
     36 double anss;
     37 LL aans;
     38 int cas,cass;
     39 LL n,m,lll,ans;
     40 int a[N][N];
     41 bool u[N][N];
     42 int dx[]={-2,-1,1,2,2,1,-1,-2};
     43 int dy[]={1,2,2,1,-1,-2,-2,-1};
     44 struct xxx
     45 {
     46     int c,num;
     47 };
     48 bool cmp(xxx aa,xxx bb)
     49 {
     50     return aa.c<bb.c;
     51 }
     52 void print()
     53 {
     54     int i,j;
     55     for(i=0;i<N;i++,puts(""))
     56         for(j=0;j<N;j++)
     57             printf("%d ",a[i][j]);
     58     puts("");
     59 }
     60 void cal(int x,int y,xxx d[])
     61 {
     62     int i,j,xx,yy,x1,y1;
     63     for(i=0;i<8;i++)
     64     {
     65         d[i].c=0;d[i].num=i;
     66         xx=x+dx[i],yy=y+dy[i];
     67         if(xx>=0 && xx<N && yy>=0 && yy<N && !u[xx][yy])
     68         {
     69             d[i].c++;
     70             for(j=0;j<8;j++)
     71             {
     72                 x1=xx+dx[j],y1=yy+dy[j];
     73                 if(x1>=0 && x1<N && y1>=0 && y1<N && !u[x1][y1])
     74                 {
     75                     d[i].c++;
     76                 }
     77             }
     78         }
     79     }
     80 }
     81 void dfs(int x,int y,int top)
     82 {
     83     if(top==65)
     84     {
     85         print();
     86         lll++;
     87         return;
     88     }
     89     int i,j,xx,yy;
     90     xxx d[8];
     91     cal(x,y,d);
     92     sort(d,d+8,cmp);
     93     for(i=0;i<8;i++)
     94     {
     95         if(d[i].c==0)continue;
     96         j=d[i].num;
     97         xx=x+dx[j],yy=y+dy[j];
     98         if(xx>=0 && xx<N && yy>=0 && yy<N && !u[xx][yy])
     99         {
    100             u[xx][yy]=1;
    101             a[xx][yy]=top;
    102             dfs(xx,yy,top+1);
    103             if(lll==cas)return;
    104             u[xx][yy]=0;
    105             a[xx][yy]=0;
    106         }
    107     }
    108 }
    109 int main()
    110 {
    111     #ifndef ONLINE_JUDGEW
    112 //    freopen("1.txt","r",stdin);
    113 //    freopen("2.txt","w",stdout);
    114     #endif
    115     int i,j,k;
    116     int x,y,z,xx,yy;
    117 //    init();
    118 //    for(scanf("%d",&cass);cass;cass--)
    119 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
    120 //    while(~scanf("%s",s))
    121     puts("输入起点坐标和需要的解的数量");
    122     while(~scanf("%d%d",&n,&m))
    123     {
    124         scanf("%d",&cas);
    125         j=clock();
    126         mem(a,0);mem(u,0);lll=0;
    127         a[n][m]=1;u[n][m]=1;
    128         dfs(n,m,2);
    129         k=clock();
    130         printf("用时 %.3lf s
    ",0.001*(k-j));
    131         puts("输入起点坐标和需要的解的数量");
    132     }
    133     return 0;
    134 }

    为了写的快就随便优化没怎么细想,如果觉得我的算法复杂度还是太高可以转http://blog.csdn.net/bone_ace/article/details/41579957

  • 相关阅读:
    Mybatis(二)入门程序通过id查找用户、模糊查找用户、添加用户、删除用户
    excel测试数据导入
    (转)接口自动化测试之http请求实践总结
    (转)TestNG框架提供两种传入参数的方法:
    Jmeter 集成Excel读写接口参数返回值
    优化问题
    redux
    clientHeight offsetTop scrollTop
    antddesign
    ACMICPC实验室周赛2020.3.6
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/5929384.html
Copyright © 2011-2022 走看看