我心飞翔

有事不慌,无事不荒,有容乃大,无欲则刚,以德立纲,外圆内方。

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 9 文章 :: 13 评论 :: 0 Trackbacks

 

 

 

以下是栈的一些基本操作:

#define STACK_INIT_SIZE 10

#define STACKINCREMENT 2

typedef struct

{

  SElemType *base;

  SElemType *top;

  int stacksize;

} Sqstack;

 

int InitStack(Sqstack &S)

{

  if(!(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))

         exit(OVERFLOW);

  S.top=S.base;

  S.stacksize=STACK_INIT_SIZE;

  return OK;

}

 

int DestroyStack(Sqstack &S)

{

  free(S.base);

  S.base=NULL;

  S.top=NULL;

  S.stacksize=0;

  return OK;

}

 

int ClearStack(Sqstack &S)

{

  S.top=S.base;

  return OK;

}

 

int StackEmpty(Sqstack S)

{

  if(S.top==S.base)

  return TRUE;

  else

  return FALSE;

}

 

int StackLength(Sqstack S)

{

  return S.top-S.base;

}

 

int GetTop(Sqstack S,SElemType &e)

{

  if(S.top>S.base)

  {

    e=*(S.top-1);

    return OK;

  }

  else

  return ERROR;

}

 

int Push(Sqstack &S,SElemType e)

{

  if(S.top-S.base>=S.stacksize)

  {

    S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));

    if(!S.base)

    exit(OVERFLOW);

    S.top=S.base+S.stacksize;

    S.stacksize+=STACKINCREMENT;

  }

  *(S.top)++=e;

  return OK;

}

 

int Pop(Sqstack &S,SElemType &e)

{

  if(S.top==S.base)

  return FALSE;

  e=*--S.top;

  return OK;

}

 

int StackTraverse(Sqstack &S,SElemType (*visit)(SElemType))

{

  while(S.top>S.base)

    visit(*S.base++);

    return OK;

}

 

 

 

 

 

 

 

 

1.数制转换:

将一个十进制转换成八,十六进制数。

typedef int SElemType; // 定义栈元素类型为整型

 #include"c1.h"

 //#include"c3-1.h" // 采用顺序栈

 #include"c2.cpp" // 利用顺序栈的基本操作

 

 /*void conversion()

 { // 对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数

   SqStack s;

   unsigned n; // 非负整数

   SElemType e;

   InitStack(s); // 初始化栈

   printf("n(>=0)=");

   scanf("%u",&n); // 输入非负十进制整数n

   while(n) // n不等于0

   {

     Push(s,n%16); // 入栈n除以16的余数(16进制的低位)

     n=n/16;

   }

   while(!StackEmpty(s)) // 当栈不空

   {

     Pop(s,e); // 弹出栈顶元素且赋值给e

     if(e<=9)

       printf("%d",e);

     else

       printf("%c",e+55);

   }

   printf("\n");

 }*/

 

 void conversion()

{

  Sqstack S;

  unsigned N;

  SElemType e;

  InitStack(S);

  scanf("%u",&N);

  while(N)

  {

    Push(S,N%8);

    N=N/8;

  }

  while(!StackEmpty(S))

  {

    Pop(S,e);

    printf("%d",e);

  }

}

 

 void main()

 {

   conversion();

 }

 

 

 

 

2.括号配对的检验:

typedef char SElemType;

#include"c1.h"

#include"c2.cpp"

 

void matching()

{

  Sqstack S;

  InitStack(S);

  char *p,a[100],e;

  int state;

  printf("请输入一组符号(仅只能含有三种{},(),[]):");

  gets(a);

  p=a;

  state=1;

  while(*p && state)

  {

         if(!(*p=='{' || *p=='}' || *p=='[' || *p==']' || *p=='(' || *p==')'))

         {

                printf("输入不正确!");

                exit(ERROR);

         }

    switch (*p)

       {

       case '(':

          case '{':

       case '[':{

          Push(S,*p++);

             break;

                            }

       case ')':{

                GetTop(S,e);

          if(!StackEmpty(S) && e=='(')

                {

               Pop(S,e);

                     p++;

                }

               else

                   state=0;

             break;

                            }

       case ']':{

                 GetTop(S,e);

          if(!StackEmpty(S) && e=='[')

                {

                Pop(S,e);

                   p++;

                }

             else

                state=0;

            break;

                            }

                 case '}':{

                 GetTop(S,e);

          if(!StackEmpty(S) && e=='{')

                {

                Pop(S,e);

                   p++;

                }

             else

                state=0;

            break;

                            }

       }

   

  }

  if(StackEmpty(S) && state)

         printf("输入的括号相符合!");

  else

        printf("输入的括号不符合!");

}

 

/*void check()

 { // 对于输入的任意一个字符串,检验括号是否配对

   Sqstack s;

   SElemType ch[80],*p,e;

   if(InitStack(s)) // 初始化栈成功

   {

     printf("请输入表达式\n");

     gets(ch);

     p=ch;

     while(*p) // 没到串尾

       switch(*p)

       {

         case '(':

         case '[':Push(s,*p++);

                  break; // 左括号入栈,且p++

         case ')':

         case ']':if(!StackEmpty(s)) // 栈不空

                  {

                    Pop(s,e); // 弹出栈顶元素

                    if(*p==')'&&e!='('||*p==']'&&e!='[') // 弹出的栈顶元素与*p不配对

                    {

                      printf("左右括号不配对\n");

                      exit(ERROR);

                    }

                    else

                    {

                      p++;

                      break; // 跳出switch语句

                    }

                  }

                  else // 栈空

                  {

                    printf("缺乏左括号\n");

                    exit(ERROR);

                  }

         default: p++; // 其它字符不处理,指针向后移

       }

     if(StackEmpty(s)) // 字符串结束时栈空

       printf("括号匹配\n");

     else

       printf("缺乏右括号\n");

   }

 }*/

 

void main()

{

       //char a[]={[(]])]};

       matching();

   //check();

}

posted on 2005-10-14 00:05 无情雨 阅读(1641) 评论(2)  编辑 收藏 引用 所属分类: 数据结构

评论

# re: 栈的实现与表示,以及数制转换,符号配对的问题 [未登录] 2008-10-05 10:58 初学者
符号配对的问题 “缺乏左括号的部分”若缺乏左括号,输出时输出两个语句“缺乏左括号”和“括号匹配”,请解决……  回复  更多评论
  

# re: 栈的实现与表示,以及数制转换,符号配对的问题 2013-11-15 10:09
这个代码的运行环境是哪个呀,我在visual c++里面有莫多错误,求解???  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理