案例
数制的转换
将一个十进制整数N转换为八进制数时,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出,输出结果就是待求得的八进制数。
#include<iostream> using namespace std; typedef int ElemType; typedef int SElemType; //定义链栈 typedef struct StackNode{ ElemType data; struct StackNode *next; }StackNode,*LinkStack; void InitStack(LinkStack &S){ //构造一个空栈 S=NULL; } //入栈 void Push(LinkStack &S,SElemType e){ //在栈顶插入元素e StackNode *p=new StackNode;//生成新结点 p->data=e; p->next=S; S=p; } //出栈 void Pop(LinkStack &S,SElemType &e){ //删除S的栈顶元素 用e返回其值 if(S==NULL) perror("栈空"); e=S->data; StackNode *p=S; //用p临时保存栈顶元素空间 以备释放 S=S->next; //修改栈顶指针 delete p; //释放原来 } //判断栈是否为空 bool StackEmpty(LinkStack S){ if(S!=NULL){ return false; }else{ return true; } } //数制的转换 void conversion(int N){ StackNode *S; int e; //对于任意一个非负十进制数,打印输出与其等值的八进制数 InitStack(S); while(N){ Push(S,N%8); //把N与8求余得到的八进制数压入栈S N=N/8; } while(!StackEmpty(S)){ Pop(S,e); cout<<e; } } int main(){ int num; scanf("%d",&num); conversion(num); return 0; }
括号匹配的检验
这里主要考虑[]和()的匹配。
#include<iostream> using namespace std; typedef int ElemType; typedef char SElemType; typedef struct StackNode{ ElemType data; struct StackNode *next; }StackNode,*LinkStack; void InitStack(LinkStack &S){ S=NULL; } //入栈 void Push(LinkStack &S,SElemType e){ //在栈顶插入元素e StackNode *p=new StackNode;//生成新结点 p->data=e; p->next=S; S=p; } //出栈 void Pop(LinkStack &S,SElemType &e){ //删除S的栈顶元素 用e返回其值 if(S==NULL) perror("栈空"); e=S->data; StackNode *p=S; //用p临时保存栈顶元素空间 以备释放 S=S->next; //修改栈顶指针 delete p; //释放原来 } //判断栈是否为空 bool StackEmpty(LinkStack S){ if(S!=NULL){ return false; }else{ return true; } } // 获取栈顶元素 SElemType GetTop(LinkStack S){ if(S!=NULL){ return S->data; //返回栈顶元素的值,栈顶指针不变 }else{ return -1; } } bool matching(){ //表达式以"#"结束 StackNode *S; InitStack(S); //初始化空栈 int flag=1; //标记匹配结果以控制循环及返回结果 char x,ch; cin>>ch; //输入第一个字符 while(ch!='#'&&flag){ cout<<ch; switch(ch){ case '[': Push(S,ch); break; case '(': Push(S,ch); break; case ')': if(!StackEmpty(S)&&GetTop(S)=='(') Pop(S,x); else flag=0; break; case ']': if(!StackEmpty(S)&&GetTop(S)=='[') Pop(S,x); else flag=0; break; } cin>>ch; //继续读入下一个字符 } if(StackEmpty(S)&&flag) return true; else return false; } int main(){ bool ans=m\atching(); if(ans){ printf("success"); }else{ printf("false"); } return 0; }