什么是栈结构:
栈结构从数据的运算来分类,栈结构具有特殊的运算规则。
从数据的逻辑结构来看,栈结构其实就是一种线性结构。
but!!!
从数据的存储结构来划分,栈结构分为两类:
顺序表结构:即用一组地址连续的内存单元依次保存栈中的数据。在程序中,可以定义一个
指定大小的结构数组来作为栈,序号为0的元素就是栈底,在定义一个top保
存栈顶的序号。
链式栈结构:即使用链式形式保存栈中各元素的值。链表首部(head引用所指向元素)为栈顶,
链表尾部(指向地址为null)为栈底。
栈结构遵循:后进先出(Last In Firt Out, LIFO)的原则处理结点数据。 举例:仓库中货物,后进先出
栈结构(只有栈顶是可以访问的)的两个基本操作:
入栈(Push):将数据保存到栈顶的操作。 进行入栈操作前,先修改栈顶引用,使其向上移一个
元素位置,然后将数据保存到栈顶引用所指的位置。
出栈(Pop):将栈顶的数据弹出的操作。 通过修改栈顶引用,使其指向栈中的下一个元素。
附上一个栈结构的实例代码(看着代码感觉比较的好理解~~):
1 import java.util.Scanner; 2 3 /********************************************************************* 4 * * 5 * 栈结构操作实例 * 6 * * 7 *********************************************************************/ 8 9 class DATA3{ 10 String name; 11 int age; 12 } 13 14 class StackType{ 15 static final int MAXLEN = 50; 16 DATA3[] data = new DATA3[MAXLEN+1]; //数据元素 17 int top; //栈顶 18 19 StackType STInit(){ 20 StackType p; 21 if((p = new StackType())!= null){ //申请栈内存 22 p.top = 0; //设置栈顶为0 23 return p; //返回指向栈的引用 24 } 25 return null; 26 } 27 //判断栈是否为空 28 boolean STIsEmpty(StackType s){ 29 boolean t; 30 t=(s.top == 0); 31 return t; 32 } 33 //判断栈是否已满 34 boolean STIsFull(StackType s){ 35 boolean t; 36 t = (s.top == MAXLEN); 37 return t; 38 } 39 //清空栈 40 void STClear(StackType s){ 41 s.top = 0; 42 } 43 //释放栈所占用空间 44 void STFree(StackType s){ 45 if(s != null){ 46 s = null; 47 } 48 } 49 //入栈操作 50 int PushST(StackType s,DATA3 data){ 51 if((s.top+1)>MAXLEN){ 52 System.out.print("栈溢出!\n"); 53 return 0; 54 } 55 s.data[++s.top] = data; //将元素入栈 56 return 1; 57 } 58 //出栈操作 59 DATA3 PopST(StackType s){ 60 if(s.top == 0){ 61 System.out.println("栈为空!"); 62 System.exit(0); 63 } 64 return(s.data[s.top]); 65 } 66 //读栈顶数据 67 DATA3 PeekST(StackType s){ 68 if(s.top == 0){ 69 System.out.println("栈为空2"); 70 System.exit(0); 71 } 72 return (s.data[s.top]); 73 } 74 } 75 /*-----------------------------调试-----------------------------------*/ 76 public class P2_3 { 77 @SuppressWarnings("resource") 78 public static void main(String[] args) { 79 StackType st =new StackType(); 80 DATA3 data1 = new DATA3(); 81 82 StackType stack = st.STInit(); //初始化栈 83 Scanner input = new Scanner(System.in); 84 System.out.println("入栈操作:"); 85 System.out.println("输入姓名 年龄进行入栈操作:"); 86 do{ 87 DATA3 data = new DATA3(); 88 data.name = input.next(); 89 90 if(data.name.equals("0")){ 91 break; //若输入0,则退出 92 }else{ 93 data.age = input.nextInt(); 94 st.PushST(stack, data); 95 } 96 }while(true); 97 String temp = "1"; 98 while(!temp.equals("0")){ 99 data1 = st.PopST(stack); 100 System.out.printf("出栈的数据是:(%s,%d)\n",data1.name,data1.age); 101 temp = input.next(); 102 } 103 System.out.println("测试结束!"); 104 st.STFree(st); //释放栈所占用的空间 105 } 106 }
时间: 2024-10-13 22:52:54