正文

我所理解的栈022005-12-15 16:00:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/goal00001111/8262.html

分享到:

//-------用数组现栈的基本操作的算法实现------------------------

Stack InitStack(int MaxElements)//构造一个空栈

{

    Stack S; 

    if(MaxElements < MinStackSize)

    {

        Puts("Stack size is too small!");

        return NULL;

    }

    S = (Stack)malloc(sizeof(struct StackRecord));

    if(!S)

    {

        printf("Out of space!");

        return NULL;

    }

    S->Array = (ElemType*)malloc(sizeof(ElemType)*MaxElements);

    if(!S->Array)

    {

        printf("Out of space!");

        return NULL;

    }

    S->StackSize = MaxElements;

    return MakeEmpty(S);

void DestroyStack(Stack *S);//初始条件:栈S已存在。 操作结果:销毁栈S。

{

    free(S->Array);

    free(S);

}

Stack MakeEmpty(Stack S);//初始条件:栈S非空。 操作结果:将栈S重置为空栈。

{

     S->TopOfStack = EmptyTop;

     return S;

int IsEmpty(Stack S);//初始条件:栈S已存在。 操作结果:判断栈是否为空栈。

{

    return  S->TopOfStack == EmptyTop;

}

 

int IsFull(Stack S);//初始条件:栈S已存在。 操作结果:判断栈是否为空栈。

{

    return  S->TopOfStack == StackSize-1;

int StackLength(Stack S);//初始条件:栈S已存在。 操作结果:返回栈S结点的个数。

{

    return S->TopOfStack - EmptyTop;

}

 

ElemType GetTop(Stack S);//初始条件:栈S非空。 操作结果:返回栈顶元素的值

{

    return S->Array[S->TopOfStack];

}

//初始条件:栈S已存在。 操作结果:插入元素X为新的栈顶元素

void Push(Stack S, ElemType X);

{

    if(IsFull(S))

        Error("Full stack!");

    else

        S->Array[++S->TopOfStack] = X;

void DeleteTop(Stack S);//初始条件:栈S非空。 操作结果:删除S的栈顶元素

{

    S->TopOfStack--;

ElemType GetTop(Stack S);//初始条件:栈S非空。 操作结果:返回栈顶元素的值

{

    return S->Array[S->TopOfStack];

}

 ElemType Pop(Stack S);//初始条件:栈S非空。 操作结果:删除S的栈顶元素, 并返回其值

{

    ElemType X = GetTop(S);

   

    DeleteTop(S);

    return X;   

}

//---------------------------------------------------------------------------------

/* 举一个简单的例子,利用栈作为临时仓库,存储操作符,将一般表达式转化为逆波兰表达式后,

求逆波兰表达式的值,即得原算术表达式的值,可实现简单四则运算

(为简单起见,设原算术表达式中参加运算的数都只有一个数字)。*/

/*2005-3-10   梁见斌*/

#include <stdio.h>

#include<stdlib.h>

#include<string.h>  

#define MAX 30

 

int GetStr(char str[]);/*输入算术表达式*/

void  Print(char exp[], int len);/*输出表达式*/

int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/

float JiSuan(char exp[]); /*求逆波兰表达式的值*/

int main(void)

{

    char str[MAX], *pstr=str;/*存储原算术表达式*/ 

   char exp[MAX], *pexp=exp;/*存储转化成的逆波兰表达式*/ 

   float result;   /*存储逆波兰表达式的值*/

   int len1, len2;/*len1存储原算术表达式的长度,len2存储转化成的逆波兰表达式的长度*/ 

   len1=GetStr(pstr);

   printf("原算术表达式: ");

   Print(pstr, len1);  

   len2=Change(pstr, pexp);

   printf("逆波兰表达式: ");

   Print(pexp,len2);

  

   result=JiSuan(pexp);

   printf("The result is: %f", result);

   system("pause");

   return 0;

}  

int GetStr(char str[])

{

    int i=0;

    printf("请输入算术表达式:  ");

    do{

      scanf("%c", &str[i++]);/*设字符‘#’为表达式的终止符*/

   }while(str[i-1] != '#' && i < MAX);

   return i;

void  Print(char exp[], int len)

{

   int i;

   for(i=0; i<len; i++)

       printf("%c", exp[i]);

   printf("\n");

int Change(char str[], char exp[])

{

    int i, t, top;/*t作为exp的下标,top作为stack的下标,i作为str的下标*/

    char stack[MAX], ch;/*作为栈使用*/   

    t=0;

   i=0;

   top=0;

   stack[0]='#';

   ch=str[i++];

   while(ch != '#')

   {

      if(ch >= '0' && ch <= '9')  //如果是数字,直接存入数组

          exp[t++]=ch;

        else if(ch == '(')  //如果是左括号,入栈

            stack[++top]=ch;

        else if(ch == ')')//如果是右括号,出栈

        {

           while(stack[top] != '(')

               exp[t++]=stack[top--];

          top--;

        }

      else if(ch == '+' || ch == '-') //如果是操作数,根据优先级出,入栈

      {

         while(top != 0 && stack[top] != '(')

             exp[t++]=stack[top--];

            stack[++top]=ch;

      }  

      else if(ch == '*' || ch == '/')

      {

         while(stack[top] == '*' || stack[top] == '/')

           exp[t++]=stack[top--];

            stack[++top]=ch;

      }  

      else    //不理会错误字符

          printf("\n%c ia a wrong letter\n", ch);

      ch=str[i++];    

   } 

   while(top != 0)

       exp[t++]=stack[top--];

   exp[t]='#';

   return t+1;

}  

float JiSuan(char exp[])

{

   float stack[MAX], d;/*作为栈使用*/

   char c;

   int i=0, t=0, top=0;

 

   c=exp[t++];

   while(c != '#')

   {

      d=c-'0';

      if(c >= '0' && c <= '9')

          stack[top++]=d;

        else

        {

           switch(c)

           {

              case '+': stack[top-2]=stack[top-2]+stack[top-1];

                           break;

               case '-': stack[top-2]=stack[top-2]-stack[top-1];

                           break;

              case '*': stack[top-2]=stack[top-2]*stack[top-1];

                           break;

            case '/': if(stack[top] != 0)

                                 stack[top-2]=stack[top-2]/stack[top-1];

                         else

                                  printf("It's error!\n");

                           break;               

           } 

         top--;

        } 

      c=exp[t++];

   }

   return stack[top-1];

}   

阅读(2209) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册