数据结构学习记录连载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;
}

posted @ 2009-10-19 20:16  蔷薇理想人生  阅读(202)  评论(0编辑  收藏  举报