栈和栈的应用

栈的实现以及括号匹配问题和你波兰表达式


在这里解释一下括号匹配问题和你波兰表达式

1,括号匹配问题

    一个左括号一个右括号看是否配对,方法是将其全部压入栈中,然后依次往出拿括号进行匹配

2.逆波兰表达式

    

表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a,1,3,+,=
http=(smtp+http+telnet)/1024 写成什么呢?
http,smtp,http,+,telnet,+,1024,/,=

用途

逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*

优势

它的优势在于只用两种简单操作,入栈和 出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。


#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#define T  10
#define MAX 100
typedef char DataType;
typedef struct Stack
{
DataType arr[MAX];
//int capacity;
int size;


}stack,*PStack;
stack sta;


//void add(PStack ps , DataType x);


// 栈的初始化 
void StackInit(PStack ps);


// 入栈 
void StackPush(PStack ps, DataType data);


// 出栈 
void StackPop(PStack ps);
//
// 获取栈顶元素 
DataType StackTop(PStack ps);


// 获取栈中元素个数 
int StackSize(PStack ps);


// 检测栈是否为空 
int StackEmpty(PStack ps);


void PrintStack(PStack ps);//打印栈


//括号匹配问题
int IsBrackets(char *ptr);
//void IsMach(char *a, PStack ps);
//
计算逆波兰表达式
//void Calculate(char *a, PStack ps);


void Pipei();


function.c文件

#include"zhan.h"




// 栈的初始化 
void StackInit(PStack ps)
{
assert(ps);

ps->size = 0;




}


 //入栈 
void StackPush(PStack ps, DataType data)
{
assert(ps);
ps->arr[ps->size] = data;
ps->size++;
}


// 出栈 
void StackPop(PStack ps)
{
assert(ps);
ps->size--;
}


// 获取栈顶元素 
DataType StackTop(PStack ps)
{
assert(ps);
return ps->arr[ps->size-1];

}


 //获取栈中元素个数 
int StackSize(PStack ps)
{
assert(ps);
return ps->size;
}


 //检测栈是否为空 
int StackEmpty(PStack ps)
{
if(ps->size)
return 1;
else
return 0;


}
void PrintStack(PStack ps)//打印栈
{
int i = 0;
for(;i < ps->size; i++)
{
printf("%c  ",ps->arr[i]);
}
}




void Pipei()//字符串匹配
 
{ int j;
char right;
char left;

char a[T] = {'1',']','0','[','[','l','{','}','{','}'};

/*for(z = 0;z < T;z++)
{
scanf("%c",a[z]);
}*/

StackInit(&sta);


for(j = 0;j < T; j++)


{
if((a[j] == '[')||(a[j] == ']')||(a[j] == '{')||(a[j] == '}')||(a[j] == '(')||(a[j] == ')'))

StackPush(&sta, a[j]);
}


PrintStack(&sta);


while(StackEmpty(&sta))

{

right =  StackTop(&sta);
    StackPop(&sta);
left =   StackTop(&sta);
StackPop(&sta);


/*if((right == '[' && (left != ']'))||(right == '{' &&(left != '}'))||(right == '(' &&(left != ')')))
{
    
printf("匹配失败");
system("pause");
return;
}*/
if(right != ']'||right != '}'||right != ')')
{ printf("匹配失败");
return 0;}
   if((right == ']' && (left != '['))||(right == '}' &&(left != '{'))||(right == ')' &&(left != '(')))
 {
    
printf("匹配失败");
system("pause");
return;
}
}
printf("匹配成功");




    system("pause");


}


int nibolan()
{
int i = 0;
int num = 0;
int flag = 0;
int right,left;
int len = 0;
char *str = "12 3 4 + * 6 - 2 8 / +";
len = strlen(str);
printf("len 的长度为%d\n",len);


for(;i < len; i++)
{

if(str[i] <= '9'&& str[i] >= '0')
{
num = num*10 + (str[i]-'0');
flag = 1;


}
if(str[i] == ' '&& flag)
{
StackPush(&sta, num);
num = 0;
flag = 0;
}


if((str[i] == '+')||(str[i] == '-')||(str[i] == '*')||(str[i] == '/'))
{
right = StackTop(&sta);


StackPop(&sta);


left = StackTop(&sta);


StackPop(&sta);


switch(str[i])
{
case '+':
StackPush(&sta, (right + left));break;
case '-':
StackPush(&sta, (right - left));break;
case '*':
StackPush(&sta, (right * left));break;
case '/':
StackPush(&sta, (right / left));break;


}
}
}
  return StackTop(&sta);

}


test.c

括号匹配问题

#include"zhan.h"
#include<stdlib.h>
#define MAX 8
void pipei()
{
 
int j,t;
char right;
char left;
char a[MAX] ;
for(t = 0;t < MAX ;t++)
{
scanf("%c",&a[t]);
}



StackInit(&sta);


for(j = 0;j < MAX; j++)


{
if((a[j] == '[')||(a[j] == ']')||(a[j] == '{')||(a[j] == '}')||(a[j] == '(')||(a[j] == ')'))

StackPush(&sta, a[j]);
}


PrintStack(&sta);


while(StackEmpty(&sta))

{

right =  StackTop(&sta);
    StackPop(&sta);
left =   StackTop(&sta);
StackPop(&sta);


if((right == '[' && (left != ']'))||(right == '{' &&(left != '}'))||(right == '(' &&(left != ')')))
{
    
printf("匹配失败");
system("pause");
return;
}
if((right == ']' && (left != '['))||(right == '}' &&(left != '{'))||(right == ')' &&(left != '(')))
{
    
printf("匹配失败");
system("pause");
return;
}
}
printf("匹配成功");


    system("pause");


}

逆波兰表达式的实现

test2.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include"zhan.h"
int main()
{
int h;
//Pipei();
h = nibolan();
printf("h的值%d\n",h);


   system("pause");
   return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值