数据结构与算法:栈模型(源码)!

简介:

这篇是继线性表链表哈夫曼树后的第四篇,数据结构复习性随笔。

本篇将带您重温栈模型的魅力。栈简单说就是“后进先出”。

本篇给出两了完美运行的程序,分别是:栈结构和链栈结构。偶觉得熟练运用这两了程序栈基本也就掌握了。

下面是源码:

复制代码
#include < iostream >
#define  MAX 1024
#define  dataType int
using   namespace  std;
// 栈结构
typedef  struct {
        dataType data[MAX];
        
int  top;
        }SeqStack, 
* s;
// 栈的初始化 
SeqStack  * Init_SeqStack(){
         SeqStack 
* s;
         s
= (SeqStack  * )malloc( sizeof (SeqStack));
         
if ( ! s){
                cout
<< " 空间不足 " << endl;
                
return  NULL;
                }
                
else {
                     s
-> top =- 1 ;
                     
return  s;
                     }
         }
// 判别栈空
int  Empty_SeqStack(SeqStack  * s){
    
if (s -> top ==- 1 )
    
return   1 ;
    
else
    
return   0 ;
    }
// 入栈
int  Push_SeqStack(SeqStack  * s,dataType x){
    
if (s -> top == MAX - 1 )
    
return   0 ;
    
else {
         s
-> top ++ ;
         s
-> data[s -> top] = x;
         
return   1 ;
         }
    }
// 查询栈中是否存在元素值
int  Check_SeqStack(SeqStack  * s,dataType x){
    
if (Empty_SeqStack(s))
    
return   0 ;
    
else {
    
for ( int  i = s -> top;i >- 1 ;i -- ){
             
if (s -> data[i] == x)
             
return   1 ;
             }
             
return   0 ;
             }
    } 
// 头元素出栈
int  Pop_SeqStack(SeqStack  * s){
    
if (Empty_SeqStack(s))
    
return   0 ;
    
else {
         s
-> top -- ;
         
return   1 ;
         }
    }
// 读取栈内信息 
void  Read_SeqStack(SeqStack  * s){
     
if (Empty_SeqStack(s))
     cout
<< " 栈中没有元素! " << endl;
     
else {
     cout
<< endl;
     cout
<< " 栈内元素有: " << endl;
     
for ( int  i = s -> top;i >- 1 ;i -- ){
             cout
<< s -> data[i] << "   " ;
             }
             }
     }
// 借助另一个栈实现删除站内任意元素
int  Delete_SeqStack(SeqStack  * s,dataType x){
    
if (Check_SeqStack(s,x)){
    SeqStack 
* tool;
    tool
= Init_SeqStack(); 
    
if (Empty_SeqStack(s))
    
return   0 ;
    
else {
         
for ( int  i = s -> top;i >- 1 ;i -- ){
         
if (s -> data[i] != x){
         Push_SeqStack(tool,s
-> data[i]);
         Pop_SeqStack(s);                 
                            }
else {
                                Pop_SeqStack(s);   
                                
for ( int  j = tool -> top;j >- 1 ;j -- ){
                                Push_SeqStack(s,tool
-> data[j]); 
                                Pop_SeqStack(tool);
                                } 
                                
break ;
                                }
         }
         
return   1 ;
         }
         }
else {
               cout
<< " 该数值在栈中不存在! " << endl;
               }
    }
// 取栈顶元素
dataType Top_SeqStack(SeqStack  * s){
         
if (Empty_SeqStack(s))
         
return   0 ;
         
else
         
return  s -> data[s -> top];                     
         }        
int  main(){
    cout
<< " 初始化栈. " << endl;
    SeqStack 
* s;
    s
= Init_SeqStack();
    cout
<< " 建立空栈完成! " << endl; 
    dataType num;
    cout
<< " 开始入栈(如果操作完毕请输入'00') " << endl;
    
bool  over = true ;
    
while (over){ 
    cout
<< " 请输入您要入栈的元素: " << endl;
    cin
>> num;
    
if (num != 00 ){
    
if (Push_SeqStack(s,num)) 
    cout
<< " 入栈成功! " << endl;
    
else
    cout
<< " 入栈失败! " << endl;
    }
else {
      over
= false ;
      }
    }
    Read_SeqStack(s); 
    cout
<< " 元素出栈(如果操作完毕请输入'00') " << endl;
    over
= true ;
    
while (over){
    cout
<< " 请输入您要出栈的元素值: " << endl;
    cin
>> num;
    
if (num != 00 ){
    
if (Delete_SeqStack(s,num))
    cout
<< " 元素出栈成功! " << endl;
    
else
    cout
<< " 元素出栈失败! " << endl;
    }
else {
      over
= false ;
      }
    }
    Read_SeqStack(s);
    
return   0 ;
    }
复制代码

 

下面是链栈源码:是借助头结点操作的。说起来也挺郁闷的,这个程序的删除链栈任意元素的算法,我写了好久,

看来指针的使用还是很生啊。我尝试了很多方法,但是指针总是乱指,出一些莫名其妙的数,真是让我郁闷了好久。

不过总算是让我调试好了,其实开着也挺简单的,但是就是写起来总出错。看来代码是靠写的,不是靠看的。

复制代码
#include < iostream >
#define  dataType int
using   namespace  std;
// 链栈结构 
typedef  struct  Node{
        dataType data;
        
struct  Node  * next;
        }StackNode,
*  LinkStack;
        LinkStack top;
// 置空栈
LinkStack Init_LinkStack(){
          
return  NULL;
          } 
// 判别栈空
int  Empty_LinkStack(LinkStack top){
    
if (top == NULL)
    
return   1 ;
    
else
    
return   0 ;
    }
// 链栈入栈
LinkStack Push_LinkStack(LinkStack top,dataType x){
          StackNode 
* s;
          s
= new  StackNode;
          s
-> data = x;
          s
-> next = top;
          top
= s;
          
return  top;
          }
// 头元素出栈
LinkStack Pop_LinkStack(LinkStack top){
          StackNode 
* p;
          
if (top == NULL)
          
return  NULL;
          
else {
               p
= top;
               top
= top -> next;
               delete p;
               
return  top;
               }
          }
// 查找数值是否寻在
int  Check_LinkStack(LinkStack top,dataType x){
    
if (top == NULL)
    cout
<< " 栈内没有元素 " << endl;
    
else {
         StackNode 
* s;
         
for (s = top;s != NULL;){ 
               
if (s -> data == x)
               
return   1 ;
               
else
               s
= s -> next;
               }
               
return   0 ;
         }
    } 
// 输出链栈
void  Read_LinkStack(LinkStack top){
     
if (top == NULL)
          cout
<< " 栈内元素为空 " << endl;
          
else {
               StackNode 
* s;
               cout
<< endl;
               cout
<< " 栈内元素为: " << endl;
               
for (s = top;s != NULL;){ 
               cout
<< s -> data << "   "
               s
= s -> next;
               }
               }
     } 
// 借助一个链栈实现删除栈内任意元素
LinkStack Delete_LinkStack(LinkStack top,dataType x){
    
if (Check_LinkStack(top,x)){
    LinkStack tool;
    tool
= Init_LinkStack(); 
    
if (Empty_LinkStack(top))
    
// return 0;
    cout << " 链栈是空栈 " << endl;
    
else {
         StackNode 
* s, * k, * p;
         
for (;top != NULL;){
         
if (top -> data != x){
                        tool
= Push_LinkStack(tool,top -> data);
                        top
= Pop_LinkStack(top);
                            }
else {
                                top
= Pop_LinkStack(top);
                                
for (;tool != NULL;){
                                      top
= Push_LinkStack(top,tool -> data); 
                                      tool
= Pop_LinkStack(tool);      
                                }
                                
break ;
                                }
         }
         
return  top;
         }
         }
else {
               cout
<< " 该数值在栈中不存在! " << endl;
               }
    }  
// 主函数 
int  main(){
    
int  num;
    
bool  over = true
    cout
<< " 建立链栈. " << endl;
    LinkStack top; 
    top
= Init_LinkStack();
    cout
<< " 链栈初始化完成 " << endl;
    cout
<< " ----入栈操作(如果操作完毕请输入'00')---- " << endl;
    
while (over){ 
    cout
<< " 请输入您要入栈的元素: " << endl;
    cin
>> num;
    
if (num != 00 ){
    top
= Push_LinkStack(top,num); 
    cout
<< " 入栈成功! " << endl;
    }
    
else {
    cout
<< " ----停止入栈---- " << endl;
    over
= false ;
    }
    }
    Read_LinkStack(top);
    cout
<< " ----出栈操作(如果操作完毕请输入'00')---- " << endl;
    over
= true ;
    
while (over){
    cout
<< " 请输入您要出栈的元素值: " << endl;
    cin
>> num;
    
if (num != 00 ){
    
if (top = Delete_LinkStack(top,num))
    cout
<< " 元素出栈成功! " << endl;
    
else
    cout
<< " 元素出栈失败! " << endl;
    }
else
    over
= false ;
    }
    Read_LinkStack(top);
    
return   0 ;
    }
复制代码


以上两个程序都完美运行,而且用的C++标准写法。


本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/19/1358111.html,如需转载请自行联系原作者

相关文章
|
5天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
|
15天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
60 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
01_设计一个有getMin功能的栈
01_设计一个有getMin功能的栈
|
5天前
|
前端开发
07_用队列实现栈
07_用队列实现栈
06_用栈来求解汉诺塔问题
06_用栈来求解汉诺塔问题
05_用一个栈实现另一个栈的排序
05_用一个栈实现另一个栈的排序
03_如何仅用递归函数和栈操作逆序一个栈
03_如何仅用递归函数和栈操作逆序一个栈
|
5天前
|
测试技术
02_由两个栈组成的队列
02_由两个栈组成的队列
|
9天前
|
存储
|
24天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
下一篇
无影云桌面