【数据结构】头歌实践教学平台·顺序栈

题目练习

1.顺序栈入栈、出栈操作

要求

编写顺序栈的入栈、出栈的操作函数。

代码

Status Push(SqStack &S, SElemType e){
// 若栈非空,将元素e入栈,函数返回OK,否则返回ERROR
/********** Begin **********/
if (S.top - S.base == S.stacksize) return ERROR;
*S.top++ = e;
return OK;
/********** End **********/
} 
Status Pop(SqStack &S,SElemType &e){
//如果栈为空,出栈失败,函数返回ERROR,否则删除栈顶元素通过e,函数返回OK
//条件: 
/********** Begin **********/ 
if (S.top == S.base) return ERROR;
e = *--S.top;
return OK;
/********** End ************/
} 

2.进制转换(10进制转换为r进制)

要求

利用栈基本操作,编写一个能将一个10进制转换成r进制(2、8、16)的函数。

代码

Status Convert(SqStack &S,int N,int r){
//十进制N转换成r(2、8、16)进制,十六进制以大写字母形式输出 
/********** Begin **********/ 
InitStack(S);
while (N) {
    Push(S, N % r);
    N = N / r;
}
int e;
while (!StackEmpty(S)) {
    Pop(S, e);
    if (e < 10) printf("%d", e);
    else printf("%c", 'A' + e - 10);
}
/********** End **********/
} 	

3.括号匹配

要求

编写一个能调用栈基本操作实现括号匹配的函数。

代码

Status Compare(SqStack &S,char Str[]){
/*括号匹配(考虑三类括号:'([{'),对输入的括号字符串Str[]进行检测*/
 /********** Begin **********/ 
 InitStack(S);
 int i = 0;
 SElemType e;
 bool flag = true;
 while (Str[i] != '\0' && flag) {
     switch(Str[i]) {
         case '(':
         //Push(S, Str[i]); break;
         case '[':
         //Push(S, Str[i]); break;
         case '{':
            Push(S, Str[i]); 
            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;
     }
     i++;
 }
if (flag && StackEmpty(S)) return true;
return false;
 /********** End **********/ 
} 

4.回文判断

要求

编写一个能调用栈基本操作实现回文判断的函数。

代码

Status Judge(SqStack &S,char str[]){
/*回文判断,对输入的字符串Str[]进行检测*/
 /********** Begin **********/ 
 InitStack(S);
 int i = 0;
 SElemType e;
 int flag = 1;
 int n = strlen(str) / 2;
 for (i = 0; i < n; i++) {
     Push(S, str[i]);
 }
 if (strlen(str) % 2 != 0) {
     i++;
 }
 while (str[i] != '\0' && flag) {
     Pop(S, e);
     if (e != str[i]) flag = 0;
     i++;
 }
 if (flag) return OK;
 return ERROR;
	/********** End **********/ 	 
}	

5.

要求

输入一个整数序列a1,a2,a3…,an。当ai不等于-1时将ai进栈;当ai=-1时,输出栈顶元素并将其出栈。

代码

void InOutS(SqStack &S,SElemType a[],int n)
{//实现一组整数序列a[]的出入栈,当a[i]为-1时出栈,其余入栈
 /********** Begin **********/  
 int i;
 SElemType e;
 for (i = 0; i < n; i++) {
     if (a[i] != -1) Push(S, a[i]);
     else {
         if (Pop(S, e)) {
             cout << e << endl;
         }
         else {
             cout << "POP ERROR" << endl;
             return;
         }
     }
 }
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值