说明:提高要求的链式堆栈实现与测试
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;
}
分享到:
相关推荐
数据结构讲义之堆栈
数据结构重要代码(查找 堆栈 排序)
数据结构课程中,采用堆栈的方式构造递归,并同时用递归函数进行结果验证。
是高等学校数据结构学习中的重点内容,堆栈的学习
完整代码 正确产生结果 三个类分开写 class linklist { protected: struct node { int data; node *next; }; node *head; int length; public:
数据结构,用队列跟堆栈来判断回文,利用堆栈的先进后出和队列的先进先出的特性
数据结构中的堆栈有着广泛的应用,思维严密,仅供大家参考。
数据结构之C++四则运算,自己写的堆栈。大二数据结构课程设计。可供大家参考学习。
《数据结构》课件 课本:清华大学出版社 数据结构(C语言版本) 严蔚敏编 第三章 堆栈与队列
通过这次专题实习,巩固和加深对所学相关知识点的理解,进一步熟悉基本自定义类、函数的应用加强对模块化程序设计和面向对象程序设计的理解。掌握C++语言程序设计的基本思想,了解简单的系统分析和设计方法。...
这是一个用数组模拟堆栈的实现的程序,希望能够对需要的人有所帮助
北航版本计算机数据结构堆栈与队列,第三章内容,不错的资源欢迎分享,可以参考了
该程序是使用数据结构中的堆栈实现将一个十进制数转化为八进制数。
数据结构方面相关的程序,如堆栈,链表,树,图等方面的各种基本算法的实现
ARM体系结构数据类型级及寄存器堆栈操作操作实验报告 ①功能实现: 说明软、硬件的设计思路,并展示实现功能,考核对设计功能的实现程度。 ②结果实现: arm-linux-gcc仿真实现,或S3C6410试验箱硬件实现。 ③实验...
VC++2012编程演练数据结构《14》链式堆栈
常用数据结构(堆栈,队列,列表)JAVA代码
大量的数据结构代码例题 堆栈 树 连表 字符串 基本操作 程序员笔试必备的东西
数据结构实验 堆栈或队列基本操作的编程实现