数据结构--顺序栈和链式栈

http://www.cnblogs.com/jingliming/p/4602458.html

栈是一种限定只在表尾进行插入或删除操作,栈也是线性表表头称为栈的底部,表尾称为栈的顶部,表为空称为空栈,栈又称为后进先出的线性表,栈也有两种表示:顺序栈与链式栈顺序栈是利用一组地址连续的存储单元,依次存放从栈底到栈顶的数据元素,附设一个指针指示栈顶的元素在栈中的位置。

     

复制代码
 1 //顺序栈的实现
 2 #define INFINITY 65535
 3 #define MAXSIZE 1000
 4 #define ElemType int
 5 
 6 typedef struct {
 7     ElemType data[MAXSIZE]; //栈的大小
 8     int top;  //栈顶的游标
 9 }Stack;
10 
11 class ArraryStack{
12 public:
13     void initStack(Stack *s); //初始化栈
14     
15     bool isEmpty(Stack *s);  //判断栈是否为空
16     
17     ElemType Top(Stack *s);  //返回栈顶的元素
18     
19     ElemType Pop(Stack *s);  //返回并删除栈顶的元素
20     
21     void Push(Stack *s,ElemType e); //将元素e压栈
22     
23     void Print(Stack *s);  //输出从栈底到栈顶的元素
24     
25     void Clear(Stack *s);  //清空栈元素
26 
27 };
28 
29 void ArraryStack::initStack(Stack *s)
30 {
31     s->top=-1;
32 }
33 
34 bool ArraryStack::isEmpty(Stack *s)
35 {
36     if (s->top==-1)
37     {
38         return true;
39     }
40     return false;
41 }
42 
43 ElemType ArraryStack::Top(Stack *s)
44 {
45     if (!isEmpty(s))
46     {
47         return s->data[s->top];
48     }
49     return INFINITY;
50 }
51 
52 ElemType ArraryStack::Pop(Stack *s)
53 {
54     if (!isEmpty(s))
55     {
56         return s->data[s->top--];
57     }
58     return INFINITY;
59 }
60 
61 void ArraryStack::Push(Stack *s,ElemType e)
62 {
63     if(s->top>=MAXSIZE-1)
64         return;
65      ++s->top;
66      s->data[s->top]=e;
67      
68 }
69 
70 void ArraryStack::Print(Stack *s)
71 {
72     for (int i=0;i<=s->top;i++)
73     {
74         printf("%d ",s->data[i]);
75     }
76     printf("\n");
77 }
78 
79 void ArraryStack::Clear(Stack *s)
80 {
81     s->top=-1;
82 }
复制代码
回到顶部(go to top)

 第二部分:链式栈的实现

复制代码
  1 //链式栈的声明
  2 template<typename T>
  3 struct LinkNode{
  4 
  5     LinkNode* next;
  6     T data;
  7 };
  8 
  9 //链式栈的实现
 10 template<typename T>
 11 class LinkStack
 12 {
 13 public:
 14     LinkStack();
 15     ~LinkStack();
 16     void Push(T value);
 17     T Pop();
 18     T Top();
 19     int Size();
 20     bool isEmpty();
 21 
 22 private:
 23     LinkNode<T> *pHead;
 24 };
 25 
 26 template<typename T>
 27 LinkStack<T>::LinkStack()
 28 {
 29     
 30     pHead=new LinkNode<T>;
 31     if(pHead==NULL)
 32         cout<<"构建头结点空间失败。"<<endl;
 33     else
 34     {
 35         pHead->next=NULL;
 36         pHead->data=NULL;
 37     }
 38 }
 39 
 40 template<typename T>
 41 LinkStack<T>::~LinkStack()
 42 {
 43 
 44 }
 45 
 46 template<typename T>
 47 void LinkStack<T>::Push(T value)
 48 {
 49     LinkNode<T> *p=new LinkNode<T>;
 50     p->data=value;
 51     p->next=pHead->next;
 52     pHead->next=p;
 53 }
 54 
 55 template<typename T>
 56 T LinkStack<T>::Pop()
 57 {
 58     T value;
 59     LinkNode<T> *p=pHead->next;
 60     if (p!=NULL)
 61     {
 62         value= p->data;
 63         pHead->next=p->next;
 64         delete p;
 65         p=NULL;
 66         return value;
 67     }
 68     else
 69     {
 70 
 71         cout<<"没有结点"<<endl;
 72         return NULL;
 73     }
 74     
 75 }
 76 
 77 template<typename T>
 78 T LinkStack<T>::Top()
 79 {
 80     LinkNode<T> *p=pHead->next;
 81     if (p!=NULL)
 82     {
 83         T value=p->data;
 84         return value;
 85     }
 86     else
 87     {
 88 
 89         cout<<"头结点为空。"<<endl;
 90         return NULL;
 91     }
 92 }
 93 
 94 template<typename T>
 95 int LinkStack<T>::Size()
 96 {
 97     int count=0;
 98     LinkNode<T> *p=pHead->next;
 99     while(p!=NULL)
100     {
101 
102         ++count;
103         p=p->next;
104     }
105     return count;
106 }
107 
108 template<typename T>
109 bool LinkStack<T>::isEmpty()
110 {
111     LinkNode<T> *p=pHead->next;
112     if (p==NULL)
113     {
114         return true;
115     }
116     return false;
117 }
复制代码

测试用例:

复制代码
 1 int main()
 2 {
 3     LinkStack<int> sta;  
 4     sta.Push(1);  
 5     sta.Push(2);  
 6     sta.Push(3);  
 7     cout << "The size of the stack now is " << sta.Size() << endl;  
 8     sta.Pop();  
 9     cout << "The top element is " << sta.Top() << endl;  
10     cout << "The size of the stack now is" << sta.Size() << endl;  
11     if (sta.isEmpty())  
12     {  
13         cout << "This stack is empty." << endl;  
14     }  
15     else  
16     {  
17         cout << "This stack is not empty." << endl;  
18     }  
19     system("pause");
20     return 0;
21 }
复制代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--双链表的创建和操作

http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1 一、双向链表的定义 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c…

MYSQL错误代码#1045 Access denied for user 'root'@'localhost'

http://blog.csdn.net/lykezhan/article/details/70880845 遇到MYSQL“错误代码#1045 Access denied for user rootlocalhost (using password:YES)” 需要重置root账号权限密码&#xff0c;这个一般还真不好解决。 不过&#xff0c;这几天调试的时候真的遇到了这种问题&#x…

常量变量以及循环

常量 1.三目运算词 三字母词表达字符???([??)]??<{??>} 2.循环 1).数组元素以及变量在内存中的分配顺序 2)goto语句应用 //电脑关机程序 #include<stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> int ma…

Linux 环境 C语言 操作MySql 的接口范例

http://www.cnblogs.com/wunaozai/p/3876134.html 接上一小节&#xff0c;本来是计划这一节用来讲数据库的增删改查&#xff0c;但是在实现的过程中&#xff0c;出现了一点小问题&#xff0c;也不是技术的问题&#xff0c;就是在字符界面上比较不好操作。比如要注册一个帐号&a…

数组相关运算

数组的初始化 数组及指针在内存中的存储 一维数组在内存中的存储 有关数组的运算 //一维数组 int a[] {1,2,3,4}; printf("%d\n",sizeof(a));//16这里的a表示的是整个数组,计算出的是整个数组的大小,单位为byte printf("%d\n",sizeof(a 0));/*a没有单独…

gets fgets 区别

http://www.cnblogs.com/aexin/p/3908003.html 1. gets与fgets gets函数原型&#xff1a;char*gets(char*buffer);//读取字符到数组&#xff1a;gets(str);str为数组名。 gets函数功能&#xff1a;从键盘上输入字符&#xff0c;直至接受到换行符或EOF时停止&#xff0c;并将读取…

Shuffle'm Up——简单模拟

【题目描述】 A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks of poker chips, S1 and S2, each stack containing C chips. Each stack may contain chips of several diff…

Fire!——两个BFS

【题目描述】 【题目分析】 看到题目后很清楚是两个BFS&#xff0c;可是我觉得对于火的BFS可以转换成判断&#xff0c;我的做法是将火的位置全部记录下来&#xff0c;然后判断某个位置距离每个火的步数是否小于当前步数&#xff0c;可是错了&#xff0c;还不清楚为什么&#x…

函数调用过程(栈桢)

栈桢 首先来看一段代码 #include<stdio.h> int add(int x, int y) {int z x y;return z; } int main() {int a 10;int b 20;int ret add(a, b);printf("ret %d\n",ret);return 0; } 此处是为了给a,b分别开辟空间,这时栈桢如图所示 两条push命令将a,b变…

整型数据存储

//代码1 #include<stdio.h> int main() {char a -1;signed char b -1;unsigned char c -1;printf("a %d, b %d, c %d", a, b, c);return 0; } 1000 0000 0000 0001 -> -1源码 1111 1111 1111 1110 -> -1反码 1111 1111 1111 1111 -> -1补码 对于…

HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

【题目描述】 HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: There are n integers, a1, a2, …, an. The initial values of them are 0. There are four kinds of operations. Operation 1: Add c to each number between ax …

[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

http://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/18/2728753.html 1. 主版本模板类 首先我们来看一段初学者都能看懂&#xff0c;应用了模板的程序&#xff1a; 1 #include <iostream>2 using namespace std;3 4 template<class T1, class T2>5 clas…

使用openssl的md5库

http://blog.csdn.net/sinat_35297665/article/details/78244523 在linux机器上&#xff0c;有一个命令可以计算出文件的md5值&#xff0c;那就是md5sum&#xff0c;如果没有的话&#xff0c;就需要安装RPM包&#xff1a;coreutils。 现在我们使用openssl的库也可以方便的计算出…

Socket网络编程--小小网盘程序(1)

http://www.cnblogs.com/wunaozai/p/3886588.html 这个系列是准备讲基于Linux Socket进行文件传输。简单的文件传输就是客户端可以上传文件&#xff0c;可以从服务器端下载文件。就这么两个功能如果再加上身份验证&#xff0c;就成了FTP服务器了&#xff0c;如果对用户的操作再…

HDU - 4348To the moon——主席树+区间修改

HDU - 4348To the moon 【题目描述】 【题目分析】 题目中说明每次更新后时间都会加1&#xff0c;而且还会需要查询以前的区间&#xff0c;还会需要返回以前的时间&#xff0c;所以是很裸的主席树。区间查询的话我们同样需要用到lazy标记 通过这道题我发现线段树的操作还是很灵…

进入一个目录需要那些权限

1.文件访问者的分类 文件的访问者具体可分为以下几类&#xff1a; (1)拥有者 (2)组拥有者 (3)其他用户 这些都代表什么意思呢&#xff1f; 其中r表示只读&#xff0c;w表示只写&#xff0c;x表示可执行&#xff0c;第一个字母代表了文件的类型&#xff0c;其中文件类型可以分为…

Socket网络编程--小小网盘程序(2)

http://www.cnblogs.com/wunaozai/p/3887728.html 这一节将不会介绍太多的技术的问题&#xff0c;这节主要是搭建一个小小的框架&#xff0c;为了方便接下来的继续编写扩展程序。本次会在上一小节的基础上加上一个身份验证的功能。 因为网盘程序不像聊天程序&#xff0c;网盘是…

Linux下的重要目录

1.bin目录 主要防止系统下的各种必备可执行文件 2./proc 目录 这个目录相当于Windows下的计算机系统信息查看以及进程动态查看&#xff0c;可以查看计算机信息&#xff0c;用来存放当前计算机上的进程信息 3./sys 目录 (1)其中block目录用于存放块设备文件 (2)bus存放总线类型…

HDU - 6278 Just $h$-index主席树+二分

HDU - 6278 Just hhh-index 【题目描述】 【题目分析】 题目要求在区间[l,r][l,r][l,r]内大于h的数不少于h个&#xff0c;对于这种最大化问题&#xff0c;我们应该想到二分。 最小情况显然是1.最大情况显然是r−l1r-l1r−l1&#xff0c;对于一个hhh&#xff0c;我们如何判断能…

Socket网络编程--小小网盘程序(3)

http://www.cnblogs.com/wunaozai/p/3891062.html 接上一小节&#xff0c;这次增加另外的两张表&#xff0c;用于记录用户是保存那些文件。增加传上来的文件的文件指纹&#xff0c;使用MD5表示。 两张表如下定义: 1 create table files(2 fid int,3 filename varchar(64),4 md…