`
thecloud
  • 浏览: 883267 次
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics