// zhan.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
using namespace std;
typedef struct stacknode
{
int data;
struct stacknode *next;
}stacknode,*LinkStack; //判断栈为空
int StackEmpty(LinkStack &top)
{
if(top ->next == NULL)
return ;
else
return ;
} //入栈函数
LinkStack push(LinkStack &top,int value)
{
LinkStack p = new stacknode;
if(p != NULL)
{
p ->data = value;//可以理解为在链表尾部插入一个节点。
p ->next = top ->next;
top ->next = p;
}
else
cout << "没有内存可分配" << endl;
return top;
} //出栈函数
int pop(LinkStack &top)
{
LinkStack temp = new stacknode;
int data;
if(StackEmpty(top))
cout << "该栈为空!" << endl;
else
{
temp = top ->next;//可以理解为删除一个节点
data = temp ->data;
top ->next = temp ->next;
delete(temp);
}
return data;
} //打印函数
void Print(LinkStack &top)
{
LinkStack top1 = top; //时刻要注意,我们不可以改变链表本身的值及指向,不过我们可以找别人来完成此事。
if(top1 ->next == NULL)
cout << "该栈为空!"<< endl;
else
{
while(top1 ->next != NULL)
{
cout << top1->next ->data<< " ";//top本身data为0,此为不带头节点的链表
top1 = top1 ->next;
}
}
} //取栈顶元素
int StackTop(LinkStack &top)
{
LinkStack p = top;
if(StackEmpty(p))
cout << "该栈为空!" << endl;
else
{
return p ->next ->data;
} } //获得栈的长度
int StackLength(LinkStack &top)
{
int length = ;
LinkStack q = top;
while(q ->next != NULL)
{
length ++;
q = q ->next;
}
return length;
} //销毁栈
void DestroyStack(LinkStack &top)
{
LinkStack p;
while(top)
{
p = top ->next;//保存top的下一个位置。
delete top;
top = p;
}
cout << "销毁成功!" << endl;
} //栈的初始化
void InitStack(LinkStack &top)
{
top = new stacknode;
top ->next = NULL;
} //前导函数
void printscreen(void)
{
cout<<"0------退出程序"<<endl
<<"1------入栈操作"<<endl
<<"2------出栈操作"<<endl
<<"3------取栈顶元素"<<endl
<<"4------判断栈是否为空"<<endl
<<"5------返回栈的元素个数"<<endl
<<"6------初始化栈"<<endl
<<"7------显示栈"<<endl
<<"8------销毁栈"<<endl
<<"9------退出程序"<<endl;
} int main()
{
LinkStack top = NULL;
InitStack(top);
printscreen();
int n,value;
cin >> n;
while(n) //输入0也可以退出循环
{
switch(n)
{
case : //入栈操作
cout << "请输入一个整数" <<endl;
cin >> value;
while(value!=) //以0作为结束条件
{
push(top,value);
cin >> value;
}
Print(top); //打印栈
cout << endl;
break;
case : //出栈操作
if(top ->next != NULL)
cout << "弹出的元素是:"<< pop(top) << endl;
break;
case : //取栈顶元素
cout << StackTop(top) << endl;
break;
case : //判断栈是否为空
if(StackEmpty(top))
cout << "该栈为空!" << endl;
else
cout << "该栈不为空!" << endl;
break;
case : //返回栈的元素个数
if(StackEmpty(top) == )
cout << StackLength(top)<<endl;
break;
case : //初始化栈
InitStack(top);
cout << endl;
break;
case ://显示栈
Print(top); //打印栈
cout << endl;
break;
case : //销毁栈
DestroyStack(top);
cout << endl;
break;
case :
goto end;
default:
cout << "不合法的输入,请重新输入"<< endl;
}
printscreen();
cin >> n;
}
end: ;
return ;
}

实验二

实验名称:栈的基本操作

实验目的:掌握栈的结构特点并熟悉栈的基本操作。

实验要求:编程实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成如下功能:

1、 采用链式存储实现栈的初始化、判空、入栈、出栈操作。

实验步骤及内容

1、首先建立一个定义多项式的结构体stacknode,及结构体指针LinkStack,该结构体包含一个数据域data,一个指向下一项的指针*next,代码如下:

typedef struct stacknode

{

int data;

struct stacknode *next;

}stacknode,*LinkStack;

2、栈的初始化,代码如下:

//栈的初始化

void InitStack(LinkStack &top)

{

top = new stacknode;

top ->next = NULL;

}

3、入栈,首先开辟内存空间,并将新开辟的结点插入在此栈的后面。具体的代码如下:

//入栈函数

LinkStack push(LinkStack &top,int value)

{

LinkStack p = new stacknode;

if(p != NULL)

{

p ->data = value;//可以理解为在链表尾部插入一个节点。

p ->next = top ->next;

top ->next = p;

}

else

cout << "没有内存可分配" << endl;

return top;

}

5、出栈,从栈中删除一个结点。首先我们必须开辟一个结点用来存储top结点的下一个结点,然后将top->next 执行下下一个结点,这样就删除了一个结点。

int pop(LinkStack &top)

{

LinkStack temp = new stacknode;

int data;

if(StackEmpty(top))

cout << "该栈为空!" << endl;

else

{

temp = top ->next;//可以理解为删除一个节点

data = temp ->data;

top ->next = temp ->next;

delete(temp);

}

return data;

}

6、打印栈,此函数用来对栈进行输出验证。

//打印函数

void Print(LinkStack &top)

{

LinkStack top1 = top;   //时刻要注意,我们不可以改变链表本身的值及指向,不过我们可以找别人来完成此事。

if(top1 ->next == NULL)

cout << "该栈为空!"<< endl;

else

{

while(top1 ->next != NULL)

{

cout << top1->next ->data<< " ";//top本身data为,此为不带头节点的链表

top1 = top1 ->next;

}

}

}

7、去栈顶元素,如果不为空则取出栈顶元素。

//取栈顶元素

int StackTop(LinkStack &top)

{

LinkStack p = top;

if(StackEmpty(p))

cout << "该栈为空!" << endl;

else

{

return p ->next ->data;

}

}

8、获取栈的长度,必须临时开辟一个新的结构体指针,作为top的副本,这样就不会破坏top本身的结构了,而且对于top的副本,我们也不能对其空间进行释放,不然top的最后一个next不会为NULL,而是一个不确定的值,这样对以后的操作造成破坏。

//获得栈的长度

int StackLength(LinkStack &top)

{

int length = 0;

LinkStack q = top;

while(q ->next != NULL)

{

length ++;

q = q ->next;

}

return length;

}

9、销毁栈,就是从栈顶开始一个节点一个节点的释放。

//销毁栈

void DestroyStack(LinkStack &top)

{

LinkStack p;

while(top)

{

p = top ->next;//保存top的下一个位置。

delete top;

top = p;

}

cout << "销毁成功!" << endl;

}

链表可以往后插,也可以往前插。

如果我们用 每次往后用p - > next = NULL;叫做 往后插。

C++ 栈的基本操作的更多相关文章

  1. 顺序栈的基本操作(C语言)

    由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不 ...

  2. PHP数据结构之五 栈的PHP的实现和栈的基本操作

    栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表. 栈栈在计算机的实现有多种方式:硬堆栈:利用CPU中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现.这类 ...

  3. SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...

  4. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...

  5. 【数据结构】C语言栈的基本操作

    #include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义节点 struct Node { int d ...

  6. c数据结构栈的基本操作(字符逆序输出)

    线性栈 输入字符,再输出 #include "stdafx.h" #include<stdlib.h> #include<malloc.h> #define ...

  7. D_S 顺序栈的基本操作

    //  main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...

  8. 链栈的基本操作(C语言)

    栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...

  9. 栈的基本操作--java实现

    package com.wyl.linklist; /** * 栈的定义及相关操作 * 用数组实现栈 * 栈是一个线性表,不过进栈和出栈操作在表尾操作 * @author wyl * */ publi ...

随机推荐

  1. C语言指针的长度和类型

    本文地址:http://www.cnblogs.com/archimedes/p/point-length-type.html,转载请注明源地址. 如果考虑应用程序的兼容性和可移植性,指针的长度就是一 ...

  2. UITableVIew 滚动流畅性优化

    影响UITableViewUITableView滚动的流畅性原因: 1. 在代理方法中做了过多的计算占用了 UI 线程的时间 2.同上 3.Cell 中 view 的组织复杂,比如使用layer并不会 ...

  3. 网易新闻iOS版使用的18个开源组件

    转载来自:http://www.jianshu.com/p/8952944f7566  原文最后编辑时间:2015.05.19 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFN ...

  4. java 接口(interface)

    接口定义:[修饰符] interface 接口名 extends 父接口名1,父接口名2 ...{ } 接口可以说是一种特殊的抽象类.接口只能定义方法,而不能实现方法的实例. 1.接口中能够定义抽象方 ...

  5. SQL 在表中随机取数据

    在一张10万行产品表(Product)中,随机取10条数据的几种方式: SET STATISTICS IO ON SELECT TOP 10 ID FROM dbo.Product(NOLOCK) W ...

  6. zobrist hashing

    Zobrist 哈希是一种专门针对棋类游戏而提出来的编码方式,以其发明者 Albert L.Zobrist 的名字命名.Zobrist 哈希通过一种特殊的置换表,也就是对棋盘上每一位置的各个可能状态赋 ...

  7. mmap 与 read/write

    mmap与read/write两条路线对文件的访问比较 我们知道无论是通过mmap或read/write访问文件在内核中都必须经过缓存, 当需要从文件读写内容时,都经过内存拷贝的方式与内核中的缓存进行 ...

  8. 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境

    一直想买本罗云彬的Win32汇编书,现在终于出典藏版了,就买了本,读一读,涨涨姿势. 我把笔记本光驱拆下来添加了个硬盘,现在想装回去发现坏了,所以守着CD盘,代码却用的是第三版的,这真是个悲剧啊. - ...

  9. 烂泥:KVM与kickstart集成

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. KVM与kickstart集成在这里我要说明下,因为在前面有关CentOS无人值守安装的文章中,我提到过如果要使用网卡PXE功能的话,内网中必须有DHC ...

  10. Tip和菜单的实现方式

    Tip和菜单有类似的功能,即鼠标光标移上去的时候显示指定元素,鼠标光标离开的时候隐藏该元素.如下 示例1:下拉菜单(鼠标移动到“客户服务”上时出现,离开则隐藏) 示例2:水平菜单(鼠标移动到“餐饮美食 ...