算法-链表实现栈

链表是一种递归的数据结构,它或者为空(null),或者只想一个节点(node)的引用,改节点包含了一个对象和执行另外一条链表的引用,节点可能是包含任意数据数据的抽象尸体,包含的只想节点的应用显示了它在链表之中的作用。相比数组来说有更多的灵活性, 本文就简单的用链表实现一下栈,栈的最大的特点就是后进先出,队列是先进先出,两者不太一样,本文将简单的用OC实现栈。

Node定义:

@interface Node : NSObject

@property  (strong,nonatomic)  NSString  *value;

@property  (strong,nonatomic)  Node  *next;

@end

Stack头文件定义:

@interface Stack : NSObject
//栈顶的元素
@property  (strong,nonatomic) Node  *first;

@property  (assign,nonatomic) NSInteger  count;

-(BOOL)isEmpty;

-(NSInteger)size;

-(void)push:(NSString *)value;

-(NSString *)pop;

-(void)remove:(NSString *)value;

@end

其中有三个主要的实现方法,入栈(push),出栈(pop),删除(remove),需要注意的是本文中的删除是单向链表的删除,如果删除最后一个,时间复杂度和链表的长度有关系,我们可以采用双向链表,有兴趣的可以研究一下。

Stack.m的实现代码:

@implementation Stack

-(BOOL)isEmpty{
    return self.count==0;
}

-(NSInteger)size{
    return self.count;
}

-(void)push:(NSString *)value{
    Node  *oldFirst=self.first;
    self.first=[[Node alloc]init];
    self.first.value=value;
    self.first.next=oldFirst;
    self.count=self.count+1;
}

-(NSString *)pop{
    if (!self.first) {
        return [NSString stringWithFormat:@"-1"];
    }
    NSString *value=self.first.value;
    self.first=self.first.next;
    self.count=self.count-1;
    return value;
}

-(void)remove:(NSString *)value{
    if ([self.first.value isEqualToString:value]) {
        Node *node=self.first;
        Node *nextNode=node.next;
        node.value=nextNode.value;
        node.next=nextNode.next;
        self.count=self.count-1;
    }else{
        Node *node=self.first;
        while (node.next) {
            if ([node.next.value isEqualToString:value]){
                if (node.next.next) {
                    Node *tempNode=node.next.next;
                    node.next=tempNode;
                }else{
                    node.next=NULL;
                }
                self.count=self.count-1;
                break;
            }else{
                node=node.next;
            }

        }
    }
}

@end

测试代码:

        Stack  *stack=[[Stack alloc]init];
        Node *first=[[Node alloc]init];
        [email protected]"iOS技术交流群:228407086";
        first.next=NULL;
        stack.first=first;
        [stack push:@"FlyElephant"];
        [stack push:@"博客园"];
        [stack push:@"keso"];
        [stack remove:@"FlyElephant"];
        NSLog(@"出栈:%@",stack.pop);
        NSLog(@"出栈:%@",stack.pop);
        NSLog(@"出栈:%@",stack.pop);
        NSLog(@"出栈:%@",stack.pop);

效果如下:

时间: 2024-10-12 07:40:21

算法-链表实现栈的相关文章

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

线性表 及Java实现 顺序表、链表、栈、队列

数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高.同时,它也是软考的重点,我们需要对这部分的内容进行一下总结. 我们先看一下数据结构和算法的整体内容. 1.线性表 概念: 数据元素的排列方式是线性的. 分类: 分类规则是根据上图中元素的存储结构来划分的. (1)顺序表 基本思想:元素的存储空间是连续的.在内

链表算法-链表前面插入节点

链表算法-链表前面插入节点

数据结构之-链表、栈的实现及题目

GitHub :  https://github.com/hanxloop/c_dev_library 前几天码了链表和栈,栈有数组实现和链表实现,自己跑了书上的示例,能跑的通,开心,接口.实现和测试分离,实现后我会补充一些使用这些代码完成的练习题目. 0.错误提示 该文件打印程序运行时出错信息. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define Error( Str ) FatalError( Str ) 5 #defi

Java数据结构——用链表实现栈

//================================================= // File Name : LinkStack_demo //------------------------------------------------------------------------------ // Author : Common //类名:Link_long //属性: //方法: class Link_long{ //链节点类 public long dData

Java用链表实现栈和队列

1.用链表实现栈 package stack; /** * * @author denghb * */ class Link { public long dData; public Link next; public Link(long dd) { dData = dd; } public void displayLink() { System.out.print(dData + " "); } } class LinkList { private Link first; public

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表.栈和队列,当然高级一点的还有树.图等,实际上链表.栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用链结构表示就是链表,如果对线性表的操作加以限制,只能有在表尾进行插入和删除元素,这就变成栈了,如果只能允许元素从表尾插入,表头删除,这就变成队列了. 链表 /* * 数据结构 链表 * 链式结构 */ #include <iostream> using namespace std; enum St

算法学习记录-栈的应用--表达式运算

前面做了栈的基本操作 总感觉需要做一个实际的例子来检验一下. 这里我将用栈来做一个简单的四则运算. 目标比较简单: 做一个带小括号(“()”)的四则运算,如果要加入到中括号(“[]”)或者大括号(“{}”),依次类推. 求一个表达式: 用下面这个算是做例子,程序最后应该可以算出任何带小括号的运算. 3+(32-6)*9+5*3-(3*(65-15)/5)+12; 方法一:后缀法. 1.了解中缀和后缀表示法 中缀表示法:刚才的那个算是就是中缀表示法,我们通常看到的数学符号就是中缀表示法,即数字在计

数据结构与算法-链表的基本操作---ShinPans

//链表操作:建立.插入.删除.查找.倒置.删除等基本操作 #include<stdio.h> #include<stdlib.h> typedef  struct LNode {       int data;       structLNode *next; }LNode,*Llist; LNode *creat_head();//创建一个空表 void creat_list(LNode *,int);//创建一个长度为n的线性链表 void insert_list(LNode