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

简介:

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

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

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

下面是源码:

复制代码
#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,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
30 1
|
6天前
|
算法
基于模糊PI控制算法的龙格库塔CSTR模型控制系统simulink建模与仿真
本项目基于MATLAB2022a,采用模糊PI控制算法结合龙格-库塔方法,对CSTR模型进行Simulink建模与仿真。通过模糊控制处理误差及变化率,实现精确控制。核心在于将模糊逻辑与经典数值方法融合,提升系统性能。
|
6天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
19天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
42 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
71 16
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
90 8
|
1月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
96 7
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
77 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
1月前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
79 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型