zoukankan      html  css  js  c++  java
  • 数据结构学习记录连载8(堆栈提高要求续)

    说明:提高要求的链式堆栈实现与测试

    1.StackNode.h:链式堆栈的结点类

    /*
    * Copyright (c) 2009,FreshAir团队嵌入式软件研发组
    * All rights reserved.
    *
    * 文件名称:StackNode.h
    * 摘 要: 堆链式栈类的定义与实现
    *
    * 当前版本:1.0
    * 作 者: 吴友强
    * 完成日期:2009年10月13日
    *
    * 取代版本:
    * 原作者 :
    * 完成日期:
    */
    template <class T> class LinkStack; //前向声明

    template <class T>
    class StackNode
    {
     friend class LinkStack<T>;
    private:
     StackNode<T> *next;
    public:
     T data;

     StackNode(const T& item, StackNode<T> *ptrNext = NULL)
     {
      data = item;
      next = ptrNext;
     }

     ~StackNode(){}
    };

    2.LinkStack.h:定义链式堆栈类和实现接口

    /*
    * Copyright (c) 2009,FreshAir团队嵌入式软件研发组
    * All rights reserved.
    *
    * 文件名称:LinkStack.h
    * 摘 要: 堆链式栈类的定义与实现
    *
    * 当前版本:1.0
    * 作 者: 吴友强
    * 完成日期:2009年10月13日
    *
    * 取代版本:
    * 原作者 :
    * 完成日期:
    */

    #include "StackNode.h"
    template <class T>
    class LinkStack
    {
    private:
     StackNode<T> *top;
     int size;
    public:
     LinkStack(void);
     ~LinkStack(void);

     int StackSize(void) const;  //堆栈数据个数
     int StackEmpty(void) const;  //堆栈是否为空(返回1)
     void Push(const T& item);  //入栈
     T Pop(void);     //出栈
     T Peek(void);     //返回栈顶数据
     void ClearStack(void);   //清空堆栈
    };

    template <class T>
    LinkStack<T>::LinkStack(void)
    {
     top = NULL;
     size = 0;
    }

    template <class T>
    LinkStack<T>::~LinkStack(void)
    {
     ClearStack();
     top = NULL;
    }

    template <class T>
    int LinkStack<T>::StackSize(void) const
    {
     return size;
    }

    template <class T>
    int LinkStack<T>::StackEmpty(void) const
    {
     return size == 0 ? 1 : 0;
    }

    /*
    * 函数名称: Push
    * 输 入: item
    * item: 压入堆栈的数据
    * 输 出:
    * 功能描述: 将item入栈
    * 作 者: 吴友强
    * 日 期: 2009年10月17日
    * 修 改:
    * 日 期:
    */
    template <class T>
    void LinkStack<T>::Push(const T& item)
    {
     StackNode<T> *newNode = new StackNode<T>(item, top);
     top = newNode;
     size++;
    }

    template <class T>
    T LinkStack<T>::Pop(void)
    {
     if (size == 0)
     {
      cout << "堆栈以空无元素可删除" << endl;
      exit(0);
     }

     StackNode<T> *p = top->next;
     T data = top->data;
     delete top;
     size--;
     top = p;
     return data;
    }

    template <class T>
    T LinkStack<T>::Peek(void)
    {
     return top->data;
    }

    template <class T>
    void LinkStack<T>::ClearStack(void)
    {
     StackNode<T> *p, *q;

     p = top;
     while (p != NULL)
     {
      q = p;
      p = p->next;
      delete q;
     }
     size = 0;
    }

    3.LinkStackTest.cpp:测试程序,计算后缀表达式(加减乘除)

    /*
    * Copyright (c) 2009,FreshAir团队嵌入式软件研发组
    * All rights reserved.
    *
    * 文件名称:LinkStackTest.cpp
    * 摘 要: 测试链式堆栈的功能,计算后缀表达式(加减乘除)
    *
    * 当前版本:1.0
    * 作 者: 吴友强
    * 完成日期:2009年10月17日
    *
    * 取代版本:
    * 原作者 :
    * 完成日期:
    */

    #include <iostream.h>
    #include <stdlib.h>
    #include <ctype.h>

    #include "LinkStack.h"

    /*
    * 函数名称: Insert
    * 输 入: s
    *   s: 用作存储的数据结构
    * 输 出:
    * 功能描述: 借助堆栈s计算后缀表达式的值后屏幕输出
    * 作 者: 吴友强
    * 日 期: 2009年10月17日
    * 修 改:
    * 日 期:
    */
    template <class T>
    void PostExp(LinkStack<T> &s)
    {
     char ch;
     T x, x1, x2;

     cout << "输入后缀表达式,结尾加符号#" << endl;

     while (cin >> ch, ch != '#')  //输入字符直到输入为'#'
     {
      if (isdigit(ch))    //ch为操作数
      {
       cin.putback(ch);   //回退一位
       cin >> x;     //输入数值给变量x
       s.Push(x);     //数值入栈
      }
      else       //ch为操作符
      {
       x2 = s.Pop();    //退栈得操作数
       x1 = s.Pop();    //退栈得被操作数
       switch (ch)
       {
       case '+':
        {
         x1 += x2;
         break;
        }
       case '-':
        {
         x1 -= x2;
         break;
        }
       case '*':
        {
         x1 *= x2;
         break;
        }
       case '/':
        {
         x1 /= x2;
         break;
        }
       default:
        break;
       }
       s.Push(x1);     //操作结果入栈
      }
     }
     cout << "后缀表达式计算结果为:" << s.Pop() << endl;
    }

    int main()
    {
     LinkStack<int> s;
     PostExp(s);

     return 0;
    }

  • 相关阅读:
    常见浏览器的兼容问题
    SCSS 的理解
    常见浏览器兼容性问题与解决方案(上)
    常见浏览器兼容性问题与解决方案(下)
    ie6定位absolute bug触发layout解决
    AngularJS 最常用的八种功能
    IE6的3像素bug
    CSS属性级Hack
    什么是SASS
    什么是less?
  • 原文地址:https://www.cnblogs.com/brucewoo/p/2252045.html
Copyright © 2011-2022 走看看