每日一省————链表之栈的简单实现

这是一个栈的简单实现,同时也实现了Iterable接口。代码较简单,比起JDK自带的Stack类,简直弱爆了。但本人主要是为了复习而已,个人觉得还是有一定参考价值的,有兴趣的看一看吧。

具体实现代码如下:

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Stack<T> implements Iterable<T>  {

    private Node<T> first;
    private int size;

    public Stack()
    {
        this.first = null;
        this.size = 0;
    }

    /**
     * 定义一个静态类,表示节点
     */
    private static class Node<T> {
        private T item;
        private Node<T> next;
    }

    public void push(T item) {

        Node<T> oldFirst = first;
        first = new Node<T>();
        first.item = item;
        first.next = oldFirst;
        size++;
    }

    public T pop() {
       if (isEmpty()) throw new NoSuchElementException("栈为空,不能继续调用此方法");
        T  t = first.item;
        first = first.next;
        size--;
        return t;
    }

    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public T peek() {

        if(isEmpty()) throw new NoSuchElementException("栈为空");
        return first.item;
    }

    @Override
    public Iterator<T> iterator() {
        return new StackIterator<T>(first);
    }

    /**
     * 栈的迭代器的具体实现
     * @author lhever
     * @param <T>
     */
    private class StackIterator<T> implements Iterator<T> {
            private Node<T> current;

            public StackIterator(Node<T> node) {
                current = node;
            }

            public boolean hasNext() {
                return current != null;
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }

            public T next() {
                if (!hasNext()) throw new NoSuchElementException();
                T item = current.item;
                current = current.next; 
                return item;
            }
        }


     public String toString() {
            StringBuilder s = new StringBuilder();
            for (T item : this)
                s.append(item + " -> ");
            return s.toString() + "null";
        }


     public static void main(String... args) {
         Stack<Integer> stack = new Stack<Integer>();
         stack.push(1);
         stack.push(2);
         stack.push(3);
         stack.push(4);
         System.out.println(stack);
         System.out.println("栈的大小是: " + stack.size());

         stack.peek();
         System.out.println(stack);
         System.out.println("栈的大小是: " + stack.size());

        stack.pop();
        System.out.println(stack);
        System.out.println("栈的大小是: " + stack.size());

        Iterator<Integer> iterator = stack.iterator();
        iterator.forEachRemaining(t -> System.out.println("< " + t + " >"));

     }

}
在C语言中,我们可以使用链表数据结构来构建一个简单的一元多项式加法运算器。链表非常适合表示多项式,因为每个节点可以存储一个系数和指数,而且可以根据需要动态增加或删除节点。下面是一个基本的设计和实现步骤: 1. 定义节点结构体(Node),包含系数(coef)、指数(exp)以及指向下一个节点的指针(next): ```c typedef struct PolynomialNode { int coef; // 系数 int exp; // 指数 struct PolynomialNode* next; // 指向下一个节点 } PolynomialNode; ``` 2. 创建和操作节点函数: - `createNode(int coef, int exp)`:用于创建新节点。 - `insertNode(PolynomialNode** head, int coef, int exp)`:将新节点插入链表头部。 - `readPolyFromFile(const char* filename)`:读取文件中的多项式并创建链表。 3. 加法操作函数: - `addPolynomials(PolynomialNode* poly1, PolynomialNode* poly2)`:遍历两个链表,对相同指数的系数进行加法,并合并结果链表。 4. 打印多项式函数: - `printPolynomial(PolynomialNode* head)`:按顺序打印链表中的各项。 5. 主函数: - 初始化两个链表,分别读取输入的多项式。 - 调用加法函数。 - 输出结果多项式。 这是一个简化版本的实现,实际操作可能会包括错误检查、用户输入处理和文件I/O操作。下面是部分关键代码示例: ```c PolynomialNode* readPolyFromFile(const char* filename) { PolynomialNode* head = NULL; FILE* file = fopen(filename, "r"); if (!file) { perror("Error opening file"); return NULL; } // 从文件中一行行读取系数和指数,并插入链表 // ... fclose(file); return head; } PolynomialNode* addPolynomials(PolynomialNode* poly1, PolynomialNode* poly2) { PolynomialNode* resultHead = NULL; // 遍历并相加两个多项式 // ... return resultHead; } int main() { PolynomialNode* poly1 = readPolyFromFile("poly1.txt"); // 文件名 PolynomialNode* poly2 = readPolyFromFile("poly2.txt"); // 文件名 PolynomialNode* result = addPolynomials(poly1, poly2); printPolynomial(result); // 清理内存 // ... return 0; } ``` 如果你想了解更多细节,比如如何从文件读取多项式,或者链表的插入和打印操作,可以继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值