数据结构小白学习笔记(二) 栈

栈的定义

限定只在一端进行插入或者删除的线性表。
特点
后进先出(LIFO).
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).
数据结构小白学习笔记(二) 栈_第1张图片
进栈:数据元素先进入,然后移动top指针++;
出栈:先移动top指针–,然后退出数据元素。
数据结构小白学习笔记(二) 栈_第2张图片
数据结构小白学习笔记(二) 栈_第3张图片
栈满后继续进栈栈会溢出,称为上溢。
栈空之后继续退栈也会溢出,称为下溢。
代码实现

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.WriteLine(); Console.WriteLine();
    Console.WriteLine("The number of elements in the stack " +st.Count);
    Console.WriteLine("Does the stack contain the elements 3 "+st.Contains(3));
    Console.ReadKey();
  }
 }
}

输出
在这里插入图片描述

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Stack st = new Stack();
   st.Push(1);
   st.Push(2);
   st.Push(3);
   
   st.Pop();

   foreach (Object obj in st)
   {
    Console.WriteLine(obj);
   }
    Console.ReadKey();
  }
 }
}

输出:
在这里插入图片描述

栈的应用

进制转换:
数据结构小白学习笔记(二) 栈_第4张图片
代码实现:

/// 
        /// 十进制转换为其他进制
        /// 
        /// 要转换的数字
        /// 目标进制
        /// 
        public static string Process(int number, int target) {
            string result = string.Empty;
            string format = "0123456789ABCDEF";
            MyStack<int> stack = new MyStack<int>(30);
            int mod = 0;
            while(number != 0) {
                mod = number % target;
                stack.Push(mod);
                number = number / target;
            }
            while (!stack.IsEmpty()) {
                int pos = stack.Pop();
                result += format[pos];
            }
            return result;
        }

表达式的求值:

算符间的优先级:

  1. 先括号内后括号外
  2. 左括号,右括号:低于括号内,高于括号外
  3. #:优先级最低

为实现算符的优先算法,中缀表达式使用两个栈:
OPND栈:存数据或运算结果
OPTR栈:存运算符
后缀表达式(逆波兰式)只需使用一个栈。
表达式分类:数据结构小白学习笔记(二) 栈_第5张图片
如3*(7-2)的计算:
将表达式转换为#3*(7-2)#。
分析该表达式的算符
#的优先级最低。建立两个栈,一个数据栈,一个运算栈。
数据栈:全部数据进栈。
运算符栈:从左向右扫描,运算符依次进栈。当该运算符比栈顶优先级高进栈,否则出栈。当左括号碰到右括号。两个运算符同时出栈。数据栈不进行操作。当“#”与“#”相遇,弹出数据栈数据,全部运算结束。
当运算符出栈时,数据栈要出栈两个数据,先出的数据作为第二个操作对象。计算完结构后将数据重新压回栈。
#3*(7-2)#运算图示:

数据栈
2
7
3
运算符栈
-
(
*
#

运算符从左向右依次扫描进栈,当右括号进栈时,右括号的优先级低于括号内“-”的优先级,依据运算符栈的进栈规则,需进栈算符优先级高于栈顶,因此“-”号出栈,同时弹出数据栈两个元素“2”和“7”,先出栈的“2”作为第二个操作数,因此运算7-2得5,将“5压回数据栈中”

运算符栈 数据栈
-(出栈)
(
* 5(结果进栈)
# 3

继续扫描,右括号)进栈,右括号)与左括号(相遇,同时出栈,数据栈不进行操作。

运算符栈 数据栈
) 出栈
( 出栈
* 5(结果进栈)
# 3

继续扫描,“#“进栈,“#”的优先级最低,小于“”的优先级。“”出栈,同时数据栈两个元素出栈,“5”和“3”出栈。进行“3*5”运算,得“15”.将15压回数据栈。

运算符栈 数据栈
*(出栈)
# 15(结果进栈)

继续扫描,“#”进栈。“#”与“#”相遇,弹出数据栈数据,全部运算结束。得出结果“15”.

运算符栈 数据栈
#
# 15(出栈,全部运算结束)

具体代码实现可点击下方链接:
代码实现

你可能感兴趣的:(数据结构)