防御间接提示注入攻击:ClawGuard运行时安全框架的设计与实践
2026/8/24 8:04:13
栈是一种基于先进后出(FILO)的数据结构
first in last out
我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。
对于数组来说,我们模拟栈的过程很简单,因为栈是后进先出,我们很容易在数组的末尾进行插入和删除。
选定数组末尾为栈顶,设计top指针 指向栈顶元素
publicclassStack01<T>implementsIterable<T>{//数组privateTdata[];//top指针 指向栈顶元素privateinttop;publicStack01(){data=(T[])newObject[10];top=-1;}publicStack01(intmaxsize){data=(T[])newObject[maxsize];top=-1;}booleanisEmpty(){returntop==-1;}intsize(){returntop+1;}//入栈booleanpush(Tvalue)throwsException{if(top+1>data.length-1){thrownewException("栈已满");}else{data[++top]=value;returntrue;}}//返回栈顶元素不移除Tpeek()throwsException{if(!isEmpty()){returndata[top];}else{thrownewException("栈为空");}}//出栈Tpop()throwsException{if(isEmpty()){thrownewException("栈为空");}else{returndata[top--];}}@OverridepublicIterator<T>iterator(){returnnewStack01.SIterator();}privateclassSIteratorimplementsIterator{privateintcusor;publicSIterator(){this.cusor=top;}@OverridepublicbooleanhasNext(){returncusor>=0;}@OverridepublicObjectnext(){if(top==-1){returnnull;}returndata[cusor--];}}}publicclassStackTest01{publicstaticvoidmain(String[]args)throwsException{//创建栈对象Stack01<String>stack=newStack01<>(12);//测试压栈stack.push("a");stack.push("b");stack.push("c");stack.push("d");for(Stringitem:stack){System.out.println(item);}System.out.println("------------------------------");//测试弹栈Stringresult=stack.pop();System.out.println("弹出的元素是:"+result);System.out.println("剩余的元素个数:"+stack.size());}}单向链表头插法
importjava.util.Iterator;publicclassStack<T>implementsIterable<T>{//记录首结点privateNodehead;//栈中元素的个数privateintN;//单向链表 节点NodeprivateclassNode{publicTitem;publicNodenext;publicNode(Titem,Nodenext){this.item=item;this.next=next;}}publicStack(){this.head=newNode(null,null);this.N=0;}//判断当前栈中元素个数是否为0publicbooleanisEmpty(){returnN==0;}//获取栈中元素的个数publicintsize(){returnN;}//把t元素压入栈publicvoidpush(Tt){//找到首结点指向的第一个结点NodeoldFirst=head.next;//创建新结点NodenewNode=newNode(t,null);//让首结点指向新结点head.next=newNode;//让新结点指向原来的第一个结点newNode.next=oldFirst;//元素个数+1;N++;}//弹出栈顶元素publicTpop(){//找到首结点指向的第一个结点NodeoldFirst=head.next;if(oldFirst==null){returnnull;}//让首结点指向原来第一个结点的下一个结点head.next=oldFirst.next;//元素个数-1;N--;returnoldFirst.item;}@OverridepublicIterator<T>iterator(){returnnewSIterator();}privateclassSIteratorimplementsIterator{privateNoden;publicSIterator(){this.n=head;}@OverridepublicbooleanhasNext(){returnn.next!=null;}@OverridepublicObjectnext(){n=n.next;returnn.item;}}}publicclassStackTest{publicstaticvoidmain(String[]args){//创建栈对象Stack<String>stack=newStack<>();//测试压栈stack.push("a");stack.push("b");stack.push("c");stack.push("d");for(Stringitem:stack){System.out.println(item);}System.out.println("------------------------------");//测试弹栈Stringresult=stack.pop();System.out.println("弹出的元素是:"+result);System.out.println("剩余的元素个数:"+stack.size());}}package java.util;
java.util.Stack 是由数组实现