C++ 栈的基本操作
// 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++ 栈的基本操作的更多相关文章
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- PHP数据结构之五 栈的PHP的实现和栈的基本操作
栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表. 栈栈在计算机的实现有多种方式:硬堆栈:利用CPU中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现.这类 ...
- SDUT-3335_数据结构实验之栈与队列八:栈的基本操作
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...
- C++实现链栈的基本操作
之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...
- 【数据结构】C语言栈的基本操作
#include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义节点 struct Node { int d ...
- c数据结构栈的基本操作(字符逆序输出)
线性栈 输入字符,再输出 #include "stdafx.h" #include<stdlib.h> #include<malloc.h> #define ...
- D_S 顺序栈的基本操作
// main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...
- 链栈的基本操作(C语言)
栈的链式储存结构称为链栈.链栈的节点类型与链式线性表的节点类型 定义相同,不同的是它是仅在表头进行操作的单链表.链栈通常用不带头节 点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示: 代码如下: ...
- 栈的基本操作--java实现
package com.wyl.linklist; /** * 栈的定义及相关操作 * 用数组实现栈 * 栈是一个线性表,不过进栈和出栈操作在表尾操作 * @author wyl * */ publi ...
随机推荐
- 蓝牙防丢器原理、实现与Android BLE接口编程
本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...
- Android网络编程基础
Android网络编程只TCP通信 TCP 服务器端工作的主要步骤如下.步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上.步骤2 调用acc ...
- 关于OC中直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型
关于OC直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型,我们完全可以把其转换为OC对象来进项打印调试,而不必对结构体中的成员变量进行打印.就好比我们可以使 ...
- 【转】Python开发指南:最佳实践精选
总体原则 价值 “为别人开发你也想要使用的工具.” ——Kenneth Reitz "简洁总是胜过可用." ——Pieter Hintjens "满足90%的使用场景.忽 ...
- java基础-在dos控制台编写简易 的java程序
第一步:在文件夹中修改隐藏的文件扩展名,让其文件的扩展名全部显示:————win7系统在文件的组织下方的文件夹和搜索选项,选择查看,将里面的隐藏选项取消: 第二步:在文件夹中新建一个text文件,将其 ...
- for循环练习题
■■■■■■■■■■■■■■■■■■■■■■■■■ 代码: <script> for(i=0;i<5;i++) { for(j=0;j<5;j++) { document.wr ...
- Apache2.4和Apache2.2访问控制配置语法对比
一.访问控制 在Apache2.2版本中,访问控制是基于客户端的主机名.IP地址以及客户端请求中的其他特征,使用Order(排序), Allow(允许), Deny(拒绝),Satisfy(满足)指令 ...
- redis 优化
系统优化echo "vm.overcommit_memory=1" > /etc/sysctl.conf 0, 表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的 ...
- 以太网卡TSO技术
一.简介 TSO(TCP Segment Offload)技术是一种利用网卡的少量处理能力,降低CPU发送数据包负载的技术,需要网卡硬件及驱动的支持. 二.原理 在不支持TSO的网卡上,TCP层向 ...
- leetcode抽风的解决办法
添加hosts: 173.230.148.103 oj.leetcode.com173.230.148.103 leetcode.com