C语言 栈的线性表示和实现 栈的实现和表示

来源:互联网 发布:门店销售数据分析 编辑:程序博客网 时间:2024/05/16 19:37
今天一上午就在琢磨栈的结构和特点,后来开始编码,因为栈的队列的操作特性比线性表复杂一些,所以今天花了一个上午
和半个下午才做好,不过还是挺高兴的,最后还是做出来了。
 好啦,还是和以前一样和大家一起来分享一下代码把:
如果代码中有什么错误,希望您不吝赐教,您可以把您的意见发送到yijiyong100@163.com,我会尽快给您回复的。如果代码中有什么错误,希望您不吝赐教,您可以把您的意见发送到yijiyong100@163.com,我会尽快给您回复的。

C语言 栈的线性实现和表示 栈的实现和表示

/****************************************//*Description: Sequence Stack*//*Email:yijiyong100@163.com*//*Author:yi_landry Haerbin Normal University Computer Science*//*Date:2008-5-1*//*Copyright:HNU2008.cop*//*Environment:turbo c 2.01 English Version*//****************************************/# include<stdlib.h># include<stdio.h># define STACK_INIT_SIZE 200# define STACK_INCREMENT 20# define OVERFLOW 0# define OK 1/****************************************//*The struct of sequence stack *//****************************************/struct SqStack{  int * base;/*the base pointer of the sequence stack*/  int * top;/*the top pointer of the sequence stack*/  int stacksize;/*the size of the sequence stack*/  int length;/*the total number of the elements in the stack*/}S;/****************************************//*Initial the stack*//****************************************/InitStack(struct SqStack * S){  S->base=S->top=(int *)malloc(STACK_INIT_SIZE*sizeof(int));  if (!S->base && !S->top) exit(OVERFLOW);  S->stacksize = STACK_INIT_SIZE;  S->length = 0;  printf("Initial the sequence stack successfully!/n");}/****************************************//*Push a element into the stack*//****************************************/StackPush(struct SqStack * S,int elm){  if(S->length >= S->stacksize)  {    S->base = (int *)realloc(S->base,(S->stacksize+STACK_INCREMENT)*(sizeof(int)));    if (!S->base)  exit(OVERFLOW);    S->top = S->base+S->length;    S->stacksize += STACK_INCREMENT;  }  if (S->length == 0)  {    *(S->base) = elm;    S->top ++;    S->length ++;    printf("The new element %d was pushed into the Stack successfully!/n",elm);  }  else  {    *(S->top) = elm;    S->top++;    S->length++;    printf("The new element %d was pushed into the Stack successfully!/n",elm);  }}/****************************************//*Pop the element at the top in the stack*//****************************************/StackPop(struct SqStack * S){  int PopElm;  PopElm = * (S->top-1);  if (S->length == 0)  {    printf("The stack now is empty,you can not pop again!/n");  }  if (S->length == 1)  {    S->top--;    *(S->top)=*(S->base)=NULL;    S->length--;    printf("Pop the element %d  successfully!/n",PopElm);  }  else  {    S->top--;    *(S->top)=NULL;    S->length--;    printf("Pop the element %d successfully!/n",PopElm);  }}/****************************************//*Judge the stack is empty or not*//****************************************/StackEmpty(struct SqStack * S){   if (S->length==0)   {     printf("The stack now is empty!/n");   }   else   {     printf("The stack now is not empty!/n");     PrintStack(S);   }}/****************************************//*Get the length of the stack*//****************************************/StackLength(struct SqStack * S){  printf("The length of current stack is %d/n",S->length);}/****************************************//*Destroy the stack and free the memory distributed at first*//****************************************/DestroyStack(struct SqStack * S){  free(S->base);  free(S->top);  S->length = 0;  printf("Destroy the stack successfully!/n");}/****************************************//*Clear all the elements in the stack*//****************************************/ClearStack(struct SqStack * S){  int *p,count =0;  p = S->base;  while(1)  {    if (count == S->length) break;    *p =NULL;    p++;  }  S->length = 0;  S->top=S->base;  printf("Clear the stack successfully!/n");}/****************************************//*Get the element at tbe location i *//****************************************/GetElement(struct SqStack * S,int i){  int *p,count = 1;  p = S->base;  if (i<=0 || i>S->length)  {    printf("The location %d you input not valid!/n",i);  }  else  {      while (1)      {        if (count == i) break;        p++;        count++;      }      printf("The element at the location %d is %d/n",i,*p);  }}/****************************************//*Find a number if or not in the stack*//****************************************/FindElement(struct SqStack * S,int elm){    int *p,count=0,totalFind=0;    p = S->base;    while (1)    {      if(count == S->length) break;      if (*p == elm)      {        totalFind++;        printf("We find %d at the location of %d in the stack!/n",elm,count+1);      }      p++;      count++;         }    if (totalFind ==0)    {      printf("We can not find %d in the stack!/n",elm);    }    else     {       printf("We totally find %d <%d> in the stack/n",elm,totalFind);    }}/****************************************//*Get prior element of some element in the stack*//****************************************/PriorElement(struct SqStack * S,int elm){  int *p,count=0,totalFind=0;  p = S->base;  while (1)  {    if(count == S->length) break;    if (*p == elm)    {      if (p == S->base)      {        printf("We can not find the prior of %d in the stack!/n",elm);      }      else      {        printf("We find prior of %d is %d at the location of %d in the stack!/n",elm,*(p-1),count);        totalFind++;      }    }    p++;    count++;       }  if(totalFind == 0)  {   printf("We can not find the prior of %d in the stack!/n",elm);  }}/****************************************//*Get next element of some element in the stack*//****************************************/NextElement(struct SqStack * S,int elm){  int *p,count=0,totalFind=0;  p = S->base;  while (1)  {    if(count == S->length) break;    if (*p == elm)    {      if (p == S->top-1)      {        printf("We can not find the next of %d in the stack!/n",elm);      }      else      {        printf("We find next of %d is %d at the location of %d in the stack!/n",elm,*(p+1),count+2);        totalFind++;      }    }    p++;    count++;       }  if(totalFind == 0)  {   printf("We can not find the next of %d in the stack!/n",elm);  }}/****************************************//*Print the stack *//****************************************/PrintStack(struct SqStack * S){  int *p,count=0;  p = S->top;  if (S->length==0)  {    printf("The stack now is empty!");  }  else if (S->length == 1)  {    p--;    printf("The current stack:/n");    printf("        _______ /n");    printf("       |       |/n");    printf("top -->|_______|/n");    printf("       |  %3d  |/n",*p);    printf("base-->|_______|/n");  }  else  {      printf("The current stack:/n");      while(1)      {        if (count==0)        {          p--;          printf("        _______ /n");          printf("       |       |/n");          printf("top -->|_______|/n");          printf("       |  %3d  |/n",*p);          printf("       |_______|/n");          count++;        }        else if (count==S->length-1)        {          p--;          printf("       |  %3d  |/n",*p);          printf("base-->|_______|/n");          break;        }        else        {          p--;          printf("       |  %3d  |/n",*p);          printf("       |_______|/n");          count++;        }      }  }}/****************************************//*Show a example to the user*//****************************************/StackExample(){  InitStack(&S);  StackPush(&S,1);  StackPush(&S,2);  StackPush(&S,3);  StackPush(&S,4);  StackPush(&S,5);  StackPush(&S,6);  StackPush(&S,5);  StackPush(&S,6);  StackPush(&S,60);  StackPush(&S,50);  StackPush(&S,7);  StackPush(&S,8);  StackPush(&S,9);  FindElement(&S,6);  FindElement(&S,7);  FindElement(&S,10);  PriorElement(&S,6);  PriorElement(&S,10);  GetElement(&S,3);  PrintStack(&S);  StackPop(&S);  PrintStack(&S);  StackPush(&S,18);  StackLength(&S);  DestroyStack(&S);  StackLength(&S);  return 0;}/****************************************//*Show the help information to the user*//****************************************/void help(){  printf("      /*****************************************************************//n");  printf("      /*****************************************************************//n");  printf("      /*        The sequence stack Operation Version 1.0                *//n");  printf("      /*             View the example information             1         *//n");  printf("      /*             Push a number into the stack             2         *//n");  printf("      /*             Pop a number from the stack              3         *//n");  printf("      /*          Find a number if or not in the stack        4         *//n");  printf("      /*       Get the prior of some number from the stack    5         *//n");  printf("      /*       Get the next  of some number from the stack    6         *//n");  printf("      /*                Get the size of stack                 7         *//n");  printf("      /*               Show the help information              8         *//n");  printf("      /*             View current  stack information          9         *//n");  printf("      /*                  Exit sequence  stack                Q         *//n");  printf("      /*****************************************************************//n");}main(){  char userInput;  int insertItem,findItem,priorItem,nextItem;  help();  InitStack(&S);  while(1)  {    printf("Slect the operation you want to do: input the correspond number!you can enter 1 to view the example ,and enter 8 to view the help./n");    scanf("%c",&userInput);    switch(userInput)    {      case '1':StackExample();break;      case '2':             for(;;)             {             printf("Please input a integer  you want to push into the stack:/n");                 printf("Forexample 1 . if you do not want to push a number into the stack again,you can input -1/n");             scanf("%d",&insertItem);                if (insertItem == -1)                break;             StackPush(&S,insertItem);             PrintStack(&S);              }          break;      case '3':              StackPop(&S);              PrintStack(&S);          break;      case '4':             for(;;)             {             printf("Please input a integer  you want to find from the stack:/n");                 printf("Forexample 1 . if you do not want to find a number from the stack again,you can input -1/n");         scanf("%d",&findItem);                if (findItem == -1)                break;             FindElement(&S,findItem);             PrintStack(&S);              }          break;      case '5':             for(;;)             {       printf("Please input a integer  you want to get the prior from the stack:/n");       printf("Forexample 1. if you do not want to get the prior form the stack again,you can input -1/n");       scanf("%d",&priorItem);       if (priorItem == -1) break;       PriorElement(&S,priorItem);           PrintStack(&S);              }          break;      case '6':            for(;;)             {       printf("Please input a integer  you want to get the next from the stack:/n");       printf("Forexample 1. if you do not want to get the next form the stack again,you can input -1/n");       scanf("%d",&nextItem);       if (nextItem == -1) break;       NextElement(&S,nextItem);           PrintStack(&S);              }          break;      case '7':StackLength(&S);break;      case '8':help();break;      case '9':PrintStack(&S);break;      case 'Q':break;      case 'q':break;    }    if (userInput == 'q'|| userInput == 'Q')    break;  }  return 0;}如果代码中有什么错误,希望您不吝赐教,您可以把您的意见发送到yijiyong100@163.com,我会尽快给您回复的。
原创粉丝点击