栈的运用

本文介绍了一种利用栈实现的十进制到十六进制的转换算法,并提供了一个用于检查括号是否正确匹配的算法。这些算法在计算机科学的基础数据结构中有着重要的应用。

1.进制转换(如十六进制)

核心算法

//进制转换
void conversion(SqStack &S ,int n)
{
 ElemType e;
 cout<<"转换之前:"<<endl;
 cout<<n<<endl;
 while(n)
 {
  Push(S,n%16);
  n/=16;
 }
 cout<<"转换成十六进制之后:"<<endl;
 while(!StackEmpty(S))
 {
  Pop(S,e);
  if(0<=e&&e<=9)
  {
   cout<<e;
  }
  else
  {
   cout<<static_cast<char>(e-10+'A');
  }
 }
 cout<<endl;
}

2.括号匹配(算法)

Status Compare(SqStack &S)
{
 ElemType e;
 int flag=TRUE;
 char ch;
 while((ch=getchar())!='$'&&flag)//$为字符串输入的结束标志
 {
  switch(ch)
  {
  case '(':
  case '[':
  case'{':
   Push(S,ch);
   break;
  case ')':
   if(Pop(S,e)==ERROR||e!='(')
   {
    flag=FALSE;
   }
   break;
  case ']':
   if(Pop(S,e)==ERROR||e!='[')
   {
    flag=FALSE;
   }
   break;
  case '}':
   if(Pop(S,e)==ERROR||e!='{')
   {
    flag=FALSE;
   }
   break;
  }
 }
 if(flag&&ch=='$'&&EmptyStack(S))
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 }
}

是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为顶,另一端称为底。中的数据元素遵守后进先出LIFO(Last In First Out)的原则。的插入操作叫做进/压/入,入数据在顶;的删除操作叫做出,出数据也在顶[^1]。 在实际应用中,有广泛的用途。在编程里,可用于实现函数调用和递归。当一个函数被调用时,系统会将当前的执行状态(如局部变量、返回地址等)压入中,当函数执行完毕后,再从中弹出这些信息,恢复之前的执行状态。 在表达式求值方面,也能发挥重要作用。例如,在计算中缀表达式时,可利用来处理运算符的优先级,将中缀表达式转换为后缀表达式,进而完成计算。 在嵌入式系统中,有一种特殊的叫Abort,也称为异常或错误,用于存储在程序执行期间发生的异常条件和错误状态。它通常是一个先进后出(Last-In-First-Out,LIFO)的结构,其中每个元素表示一个异常或错误信息[^3]。 在实际解决问题时,需要通过实现来完成一些运算,可定义一个C++的类来抽象出,即`class stack`,在`stack`内部进行基本运算,也就是内部成员函数的编写。的实现有链式储存和顺序储存两种方式,顺序存储的本质是通过数组开辟连续的一串储存空间,因此需要在`stack`的私有成员中定义`cnt`作为计量当前中元素个数的变量,定义数组`data[maxlen]`储存中元素[^2]。 以下是一个简单的顺序的C++实现示例: ```cpp #include <iostream> const int maxlen = 100; class stack { private: int cnt; int data[maxlen]; public: stack() : cnt(0) {} // 入操作 void push(int value) { if (cnt < maxlen) { data[cnt++] = value; } } // 出操作 int pop() { if (cnt > 0) { return data[--cnt]; } return -1; // 表示为空 } // 判断是否为空 bool isEmpty() { return cnt == 0; } }; int main() { stack s; s.push(1); s.push(2); std::cout << s.pop() << std::endl; std::cout << s.pop() << std::endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值